Introduction

This report is an overview of the initial observations and analysis performed on the Food Security Cluster 5Ws data for the first three-quarters of 2021; the issues identified and analysis have been broken into large groups corresponding with the first 4 chapters – analysis by geography, activities and modalities, partners and beneficiaries. This report ends with a brief section on next steps and an interactive reference table and reference map.

We have endeavoured to provide actionable information and believe that releasing this report is a necessary part of jumpstarting the process of resolving the more pressing concerns identified. Further analysis is merited in several areas; and this will be undertaken once consultations with partners have been completed.

Unless otherwise specified, beneficiary figures in this report are the number of unique beneficiaries, as opposed to beneficiary frequencies.

1. Geographical coverage

1.1 Comparing beneficiaries reached and 2021 PIN by state and region

A total of 2,088,142 unique beneficiaries have been reached across the country; this is 75.43% of the targetted 2,768,349 persons; however, not all the beneficiaries reached corresponded to areas where there were targets – this is explored in more detail in the section on townships.



1.2 Table of beneficiaries and PIN by state and region

Beneficiaries reached and PIN by state/region
state beneficiaries %_of_ben target %_of_target %_target_reached PIN
Yangon 1,274,906 61.27 1,777,522 64.21 71.72 1,777,522
Rakhine 430,247 20.68 487,182 17.60 88.31 632,805
Kachin 87,452 4.20 86,117 3.11 101.55 102,649
Shan (North) 64,794 3.11 13,428 0.49 482.53 24,657
Ayeyarwady 55,276 2.66 0 0.00 NA 0
Kayin 46,932 2.26 6,855 0.25 684.64 6,855
Mon 43,442 2.09 0 0.00 NA 0
Mandalay 24,829 1.19 381,818 13.79 6.50 381,818
Kayah 15,920 0.77 5,830 0.21 273.07 5,830
Chin 13,550 0.65 5,106 0.18 265.37 13,275
Shan (South) 9,304 0.45 1,978 0.07 470.37 2,054
Sagaing 8,090 0.39 0 0.00 NA 0
Bago (East) 4,312 0.21 2,513 0.09 171.59 2,513
Magway 1,695 0.08 0 0.00 NA 0


Yangon and Rakhine form both 82% of the target and 82% of the beneficiaries reached. Mandalay has has the largest difference between targets and beneficiaries reached. There were four states (Ayeyarwady, Mon, Sagaing and Magway) where beneficiaries were reached but were not included as part of the 2021 target or PIN; however, the beneficiaries reached in these areas represent less than 5% of all beneficiaries reached. Additionally, targets have been exceeded in 7 states, with Kayin having reached 684% of its target of 6,855 persons.

However, moving forward, the PIN for 2022 is much more evenly spread across the country: with reference to the plot below, Yangon, along with Magway and Mandalay have some of the lowest proportions of vulnerable persons in relation to the total state population, meaning that careful beneficiary selection and tight vulnerability in these areas will necessary to avoid excessive inclusion errors.



1.3 Township-level distribution of beneficiaries

Just as the response is heavily weighted towards Yangon and Rakhine at the state and region level, the same is true at the township level as well. These 10 townships below are where 80% of beneficiaries have been reached collectively, they represent 53% of the 2021 target. In particular, Hlaingtharya has beneficiary figures that are 378% of its target. Additionally, neither Kawareik in Kayin or Kyaikmaraw in Mon were targetted as part of the 2021 PIN despite being in the top 10 townships by beneficiaries reached – only 88.5% of beneficiaries corresponded to townships with targets.

Top 10 townships by beneficiaries reached in 2021
township state beneficiaries %_of_ben target %_of_target %reached
Hlaingtharya Yangon 772,658 37 204,542 11.29 377.8
Dagon Myothit (Seikkan) Yangon 276,430 13.24 199,242 11 138.7
Dala Yangon 170,463 8.16 200,589 11.07 84.98
Sittwe Rakhine 147,864 7.08 127,750 7.05 115.8
Buthidaung Rakhine 106,815 5.12 121,631 6.71 87.82
Maungdaw Rakhine 80,348 3.85 71,360 3.94 112.6
Pauktaw Rakhine 33,907 1.62 28,162 1.55 120.4
Kawkareik Kayin 30,867 1.48 0 0 NA
Lashio Shan (North) 29,963 1.43 5.7 0 525,667
Kyaikmaraw Mon 28,590 1.37 0 0 NA


107 townships have been reached by food security activities in the first three-quarters of 2021. This is less than a third of the 330 townships in the country. It is also important to note that three townships – Hpapun in Kayin, Muse in Shan (North) and Kyethi in Shan (South) have been targetted since the initial 2021 HRP, yet have not been reached by any FSC activities; 10 townships, overall, in either the HRP or IERP, have not benefitted from any FSC activities.

Overall, 66.73% of the targetted population was reached. From the histogram below, we can see that overreach and under-reaching are very common at the township level – townships are commonly clustered at around 0% reached and also at 200% reached or more. Of the 51 townships targetted in 2021; 21 townships reached more than 120% of their target, 4 reached between 100% and 119% of their target; 7 townships reached between 80% and 100% of their target; and 2 townships reached less than 80% of their target.



1.4 Locations

Partners have responded in a total of 1563 locations across the country, with the vast majority of locations only having only one partner operating in them; the maximum number of partners in any location is 3. Of the 5776 rows reported in the 5Ws, only 156 did not report a specific location.

Locations are classified into three groups – camps, industrial zones and villages/towns/wards:

Summary of location types
location_type locations townships beneficiaries pc_of_ben avg_ben_per_loc
village_ward_town 1,157 90 1,422,282 81.42 1,229
camp 421 38 316,648 18.13 752
industrial_zone 5 2 7,870 0.45 1,574


The vast majority of locations are served by only one partner. Below are a series of histograms showing the variation in the number of beneficiaries by location, split by number of partners in each location:


The more partners operating in a given location, the higher the average number of beneficiaries; however, it should be noted that these multi-partner locations are comparatively rare:

partners locations avg_beneficiaries
one_partner 1,496 182
two_partners 61 676
three_partners 11 859



2. Activities and modalities

2.1 Progress by activity

Partners reported their achievements across the eight 5W activities. As note, we see that the majority of the caseload for monthly cash-based transfers was established prior to 2021 (with the number of beneficiaries only increasing very incrementally across the couese of the year) – this aligns with our understanding that many of the projects contributing to this activity were multi-year in nature and had been ongoing prior to the HRP.

One of the difficulties of interpreting these data is that it is not always apparent where the patterns observed are reflective or changes in the field (such as changes in access, funding or staffing) or if they are instead due to partners’ reporting behaviours. We note, for instance, a large jump in the number of beneficiaries for fishery its and food baskets around July 2021 – this was due to the newly-approved addendum to the HRP. However, some of the other changes are less clear and will require careful exploration with partners.


2.2 Delivery modalilties

Cash was the main delivery modality in four out of the eight activities under the Food Security Cluster, followed by “in-kind”, which was predominantly employed in three. However, the in-kind modality has the highest reach, given the especially large beneficiary numbers originating from the provision of monthly food baskets. We also note several misclassifications – small portions of monthly cash transfers have been coded as in-kind and there are in-kind food baskets coded as hybrid. It might also be worth more clearly delineating between “support for income-generating activities” and the “provision of technical training” as service delivery and support are heavily present in both.



63% of beneficiary frequencies received support through the in-kind delivery modality; we use beneficiary frequencies here as there were several instances of modalities changing partway through an intervention: for reference, 85% of beneficiaries were reached initially with in-kind interventions, meaning that there was a tendency to diversify away from in-kind support over 2021. 33% of beneficiary frequencies were reached by cash transfers.


Beneficiary frequencies by delivery modalities and frequency of distribution
delivery_modality First Monthly One-off Other NA Total pc_of_Total
In-kind 303,595 1,222,709 407,196 1,417,351 110,723 3,461,574 63
Cash 894 1,572,070 103,357 4,746 117,525 1,798,592 32.74
Hybrid (In-kind & Cash) NA 183,097 2,488 10,810 NA 196,395 3.57
Voucher NA NA 2,652 16,519 NA 19,171 0.35
Service delivery/support NA 4,383 9,060 4,690 NA 18,133 0.33
NA NA NA NA 423 NA 423 0.01
Total 304,489 2,982,259 524,753 1,454,539 228,248 5,494,288 100


Regarding the table above, there is a strong argument to remove the option “other” from the 5W column frequency (referring to frequency of transfer/delivery) – what exactly it connotes is unclear, as partners might elect this option for activities that occur both more and less frequently than every month; there is also the possibility that partners are just electing “other” instead of leaving the column blank. It is possible to backfill some of the “other” values from the beneficiary_recurrency column. This will be explored further in the chapter on beneficiaries.

A key piece of missing information not currently captured by the 5W template is the duration of these activities – the number of months a monthly food basket is provided can only be calculated somewhat reliably with considerable effort. The table below shows the average duration (in months) of the various activities in the frequency category “Monthly”:

Average duration (in months) of monthly activities
activity avg_duration_months
Provide monthly cash-based transfers 6.205
Provide monthly food baskets 4.688
Provide technical training 2.18
Cash for Work / Food for Assets 1.838
Provide support for income generation 1


2.3 Monetary values of intervention packages per household



The most common transfer values – in terms of beneficiaries reached – are between USD 10 and USD 20, though it should be noted – and can be more clearly seen from the table below, a not insignificant number of beneficiaries (about 8%) were reached by cash transfer interventions valued at more than USD 100 per household. Please note that these monetary values were calculated only from rows with unique beneficiaries so that we are not using the cumulative sums per household.

Cash transfer, hybrid and voucher values per household by frequency of transfer (USD)
transfer_value First Monthly One-off Other Total pc_of_Total
<$10 185 30,682 2,126 9,543 42,536 14.82
>=$10_<$20 241 122,979 8,002 502 131,724 45.9
>=$20_<$40 242 11,335 13,756 1,881 27,214 9.48
>=$40_<$60 226 29,536 12,850 188 42,800 14.91
>=$60_<$100 NA 9,826 4,850 4,912 19,588 6.83
>=$100_<$200 NA 413 14,255 789 15,457 5.39
>=$200 NA 23 7,204 438 7,665 2.67


Next, let us take a look at household package values by activity type:

Overall, the highest average cash transfers were from activities providing support for income generation and the lowest averages coming from monthly cash-based transfers (after discounting food baskets, where less than 1% of activities reported the package value).

It would be fruitful to explore the provision of monthly cash-based transfers in more detail – this activity has a very clear peak at >=$10_<$20. A closer look reveals that this is almost entirely due to the 122,854 beneficiaries who received monthly transfers of USD 10.50/month (or MMK 15,000) per household. It is unclear whether this is a data entry error – but what we do know is that the households that received this type of transfer were not abnormally small; it might be possible that be possible that this activity had been conceived as one singular transfer that had been split across several months.

This should be followed up with the 7 partners who provided this transfer value to beneficiary households; they are: Save the Children, WFP, Myanmar Heart Organisation, People for People, Plan International, World Vision Myanmar and Karuna Mission Social Solidarity.

If correct, this amount falls far below the minimum expenditure basket for food identified by the Cash Working Group, which established a floor of MMK 190,555 per household per month. Below is a table which summarises the percentage of the minimum expenditure basket is covered by the different bins we have established for the cash-transfer values:

Monthly cash-based transfer by percentage of MEB received
usd_hhd_bin avg_pc_of_meb avg_usd_month beneficiaries pc_of_ben
<$10 4.21 5.61 32,746 14.82
>=$10_<$20 7.92 10.57 122,582 55.47
>=$20_<$40 25.17 33.57 16,431 7.43
>=$40_<$60 34.06 45.43 28,927 13.09
>=$60_<$100 53.66 71.58 15,836 7.17
>=$100_<$200 79.86 106.5 4,463 2.02
>=$200 199.2 265.6 22 0.01

Around 9% of beneficiaries of monthly cash-based transfers have received more than 50% of the value of the minimum expenditure basket for food. Notably, 15% of beneficiaries have received less than USD 10 per household per month. This underscores the importance of standardisation: beneficiaries have already received very different package amounts and there is a pressing need to collect information on whether cash transfers (and food baskets) have been designed to be full rations or are instead intended to be supplementary activities. This is key from a coordination standpoint as we cannot consider the food security needs of those who have only received supplementary transfers to have been covered.



3. Partners

Of the 51 partners of the Food Security Cluster, a total of 49 of them classified themselves as implementing partners within the 5Ws. They are fairly evenly split themselves between HRP indicators, with 32 contributing towards food and cash assistance and 29 contributing towards agriculture and other livelihood support. 28 partners have reached less than 10,000 unique beneficiaries and the median unique beneficiaries reached by partners is 4,697. Below are the top 10 partners by HRP indicator. As a side note, Zigway should be considered as a vendor/supplier of WFP, and not the implementing partner – some follow up with WFP will be necessary to rectify this.

Top 10 partners by beneficiaries reached, by HRP indicator
Partners HRP indicator1 1. Number of people who received food and/or cash assistance Partners HRP indicator2 2. Number of people who received agriculture and other livelihood support
Open Data Myanmar (ODM) 304,919 Center for Social Integrity (CSI) 28,725
MRCS 263,005 Action Contre la Faim 19,109
Zigway 223,478 Action for Green Earth 16,037
Hlaingthayar Development Network 189,701 World Vision Myanmar 15,303
World Vision Myanmar 168,698 Myanmar Heart Development Organization 9,867
Urban Strength (US) 128,878 WFP 7,691
WFP 105,984 Save the Children 7,543
Hlaingthayar Youth Network 96,145 Phyu Sin Saydanar Action Group 6,052
Action for Green Earth 67,578 BRAC Myanmar 5,162
Myanmar Heart Development Organization 63,838 MRCS 5,051


3.1 Distribution of partners by beneficiaries and geographic reach

Whilst there is quite a bit of variation in the number of beneficiaries reached, we can see that partners’ geographic footprints are – on the whole – quite limited. Only 4 partners have a presence in more than 10 townships, with only 10 being present in more than 5 townships. 79% of our partners (clustered along the bottom of the chart) are present in 5 or less townships. This distribution of partners is an impediment to a countrywide response and it is imperative to understand how best to incentivise partners to expand their footprints.


3.2 Map of number of partners and 2022 people in need by state/region

Food Security Cluster partners are not well-positioned to meet the needs of the 2022 population in need. Partners are largely concentrated in Kachin, Rakhine and Yangon, with no partners present in Tanintharyi and Bago (West) and only one partner present in Magway, Bago (East) and Shan (East). The number of partners in Ayeryawady is also quite disproportionate with the number of people in need in that region.

Overall, 71% of townships, containing 62% of the 2022 PIN, do not have any partners present. This lack of nationwide coverage will be one of the most important constraints that the FSC will face in meeting the 2022 needs of vulnerable, food insecure persons and IDPs – and resolving this will necessitate increasing partner coverage and finding new partners the cluster.

3.3 Reporting organisations

There are 58 combinations between reporting organisations and implementing partners, 19 of which are instances where the reporting organisation and the implementing partner are the same organisation; once these are filtered out, all the remaining implementing partners correspond to just 10 reporting organisations:

Number of implementing partners by reporting organisation
reporting_organization implementing_partners
WFP 21
Save the Children 4
FAO 3
Finn Church Aid 3
Mercy Corps 2
Trocaire 2
AVSI 1
Danish Refugee Council 1
Helvetas 1
Oxfam 1

Regarding questions of membership, it would be safe to say that all partners who reported in the 5Ws – be they reporting organisations or implementing partners – in addition to strategic partners and partners who aid in analysis who are not represented in the 5Ws, are FSC partners. However, for this report, we have used implementing_partners for most of the analysis as, by their nature, reporting organisations do not have a field presence. As a side note, FAO has not classified itself as an implementing partner, having reported no activities that were directly implemented by them.


3.4 Types of partners

Average reach by implementing partner type
implementing_partner_type avg_beneficiaries avg_townships avg_states
INGO 86,455 4.882 1.941
NNGO 89,651 3.258 1.194
UN 1,245,381 52 11

There is no real difference between the average numbers of beneficiaries reached by INGOs and NNGOs; however, the geographical reach of INGOs is markedly greater, perhaps due to the much tighter geographical focus of several community-based organisations. There is only one agency in the “UN” category for implementing partner type – WFP.

The only notable thing about the donor column is its incompleteness, which is understandable – only 43% (representing only 10% of all reported beneficiary frequencies) of the rows are filled. Additionally, we also observe a number of errors, including cases where multiple donors have been combined into one row as well as numerous instances where WFP, FAO and UN WOMEN were classified as donors as opposed to reporting organisations. Not much useful analysis can be extracted from this column at present.



4. Beneficiaries

4.1 Beneficiary disaggregations

Currently, in the 5Ws, the vast majority of beneficiary diasaggregations have been backfilled from census data and do not, consequently, provide an accurate picture of the population that have been reached bu Food Security interventions. It is not possible to determine how far reality diverges from what has been reported so far – meaning that we also cannot determine if there has been any bias in beneficiary selection and targetting. It is imperative to begin collecting disaggregated beneficiary data from partners.

It is entirely possible that partners are collecting this data – disaggregated beneficiary data is one of the most common data required for internal and external reporting – and that it is merely necessary to work with partners to wrangle their data into the 5W format. However, the capacities of partners to disaggregate beneficiary data should be investigated by the cluster and is an important issues that should be brought up in te next plenary session.


4.2 Types of beneficiaries

The states and sub-regions in which we are working the most with IDPs are Bago (East), Kachin, Chin, Shan (North) and Kayah. Overall, 75.27% of beneficiaries are from the host/local community, 14.08% are stateless persons from Rakhine and 10.54% are IDPs. Returnees are the rarest type of beneficiary reached, forming only 0.11% of all beneficiaries reached. Each row in the table below shows the percentage of each beneficiary type within each state/region.

Beneficiary types by state/region
state Host/local Community Internally Displaced Returnees Rakhine stateless beneficiaries
Ayeyarwady 100.00 0.00 0.00 0.00 55,276
Bago (East) 0.00 100.00 0.00 0.00 4,312
Chin 9.23 90.77 0.00 0.00 13,550
Kachin 6.49 91.80 1.71 0.00 87,452
Kayah 45.89 54.11 0.00 0.00 15,920
Kayin 89.99 10.01 0.00 0.00 46,932
Magway 100.00 0.00 0.00 0.00 1,695
Mandalay 100.00 0.00 0.00 0.00 24,829
Mon 91.68 6.52 1.80 0.00 43,442
Rakhine 19.17 12.50 0.00 68.33 430,247
Sagaing 100.00 0.00 0.00 0.00 8,090
Shan (East) 100.00 0.00 0.00 0.00 510
Shan (North) 25.69 74.31 0.00 0.00 71,677
Shan (South) 100.00 0.00 0.00 0.00 9,304
Yangon 100.00 0.00 0.00 0.00 1,274,906
Total 75.27 10.54 0.11 14.08 NA


Compared to only the 2021 HRP targets (as the IERP does not have breakdowns of the target by beneficiary type), we can see that whilst targets have been mostly exceeded, neither the targets for returnees/resettled in Kachin or Shan (North) nor targets for IDPs in Rakhine or Kayin have been met. Interestingly, for Rakhine, the targets for the host/local population have been greatly exceeded. In Bago (East), Chin, and particularly Shan (North), the targets for IDPs have been greatly exceeded, in comparison to the 2021 HRP targets:

Percentage of 2021 HRP target reached by beneficiary type
state host_local% idp% returnees% rakhine_stateless% total%
Bago (East) NA 171.6 NA NA 171.6
Chin 0 200.7 NA NA 156.9
Kachin 72.94 108.8 32.88 NA 101.5
Kayin NA 68.5 NA NA 97.4
Rakhine 185.4 32.66 NA 105.8 88.31
Shan (North) 132 743 0 NA 394.9
Shan (South) 0 NA NA NA 0


Stateless persons from Rakhine have the largest average household sizes, and the largest variations in household size. The thick bar in the middle of each box shows the average household size for each beneficiary type – this value is also shown in the text label below the line. The lower and upper borders of each box indicate the values for the 25th and 75th percentiles respectively. For instance, we can see that households at the 25th percentile of households in host/local communities have only one member and households that have around 5 members have more members than 75% of all the households in that group. Outliers are marked by dots. We note a lot of potential data entry errors where less than one person per household have been recorded.



4.3 Beneficiaries by activity frequency

The categories “First” and “Monthly” in the frequency column do not seem to be filled as intended, as can be seen from the plot below:


The assumption for these categories is that the first instance of a beneficiary receiving support (as part of a continuing monthly support package) would fall under the category “First” and every subsequent time they received support, it would be under “Monthly”.

But we can see that this is not the case – monthly beneficiaries predated the use of the “First” category by at least four months; furthermore, the spike in first-time beneficiaries in May 2021 was not accompanied by any increase in monthly beneficiaries in the subsequent months – in fact, there was a decline in monthly beneficiaries. Complicating all this is that we are not sure which of the beneficiaries track beneficiaries in a comprehensive manner i.e. with a beneficiary database and beneficiary ID cards. All this indicates that – after confirming this with partners – we should abandon the “First” category and recode these entries as “One-off”.


4.4 Gaps in monthly programming

Number of beneficiaries and locations by duration of gaps in implementation
gap_months locations townships beneficiaries pc_of_ben
0 257 33 457,591 75.39
1 26 15 54,078 8.91
2 94 15 57,032 9.4
3 4 4 36,648 6.04
4 6 3 277 0.05
5 4 2 1,360 0.22

75% of beneficiaries experienced no gaps in monthly programming and very long gaps of 4 or 5 months are quite rare; of the beneficiaries who did experience gaps in monthly coverage, most experienced gaps of 1-2 months. The 10 townships which experienced the longest average gaps between “monthly” activities were: Mohnyin, Myitkyina, Hpakant, Mogaung, Chipwi and Waingmaw in Kachin; Shwepyithar in Yangon; Demoso and Loikaw in Kayah; and Kutkai in Shan. Overall, 12 townships in Kachin experienced gaps in the implementation of monthly activities; 6 in Rakhine; 2 each in Ayeyarwady, Kayah and Shan; and 1 in Yangon. It should be explored whether the delays in these areas were due to access issues or other other constraints.

There are 167 entries coded as being implemented on a monthly basis that have not recurred – that is, they have only been implemented once: we should check with partners if these are merely the first instances or if they are errors in data entry or if there have been issues with access, security or funding.


4.5 Potential for post-distribution monitoring

The table below shows activities which have been implemented for 6 months or more, the number of locations they were implemented in and the number of unique beneficiaries reached by activities meeting these criteria. The possibility of joint monitoring – or at least the joint review and analysis of monitoring data – will be explored, in consultation with these partners. The rationale being that 6 months of implementation should be a long enough period of time to make impact monitoring feasible; additionally, joint monitoring will be further facilitated by the similarity of these activities, almost all of which are recurrent cash transfers or distributions of food baskets.

Number of unique beneficiaries which have received at least 6 months of recurrent food security support
activity partners locations beneficiaries
Provide monthly cash-based transfers 6 232 183,237
Provide monthly food baskets 7 39 141,652
Provide technical training 1 12 300

The partners which have implemented activities fitting these criteria are WFP, Karuna Mission Social Solidarity, World Vision Myanmar, Myanmar Open Heart Development Organisation, People for People and Plan International for monthly cash transfers; World Vision Myanmar, Myanmar Open Heart Development Organisation, Action for Green Earth, People Hope Community Development (PHCD), Together for Sustainable Development, Karuna Mission Social Solidarity and WFP for monthly food baskets; and the Da-Nu National Affairs Organisation (DNAO) for technical training.



5. Next steps

  1. Communicate to partners that Yangon is severely oversubscribed in comparison to the rest of the country, above all in the townships of Hlaingtharya, Dagon Myothit (Seikkan), and Dala.

  2. Collect existing intervention packages from partners in order to begin the process of standardisation and to support the review of food baskets for their caloric and nutritional value. Perform additional analysis to understand if beneficiaries in close proximity to each other have received widely divergent package values. Additionally, speak with partners to understand why cash transfer values vary by so much even within the same activity implemented by the same partner.

  3. Revisit areas which have only received smaller supplementary transfers – a transfer of around USD 10 per household per month cannot be considered to have covered the food security needs for that area – other partners may be necessary to cover the gap.

  4. Advocate for the expansion of partners’ geographic footprints to reach the remaining 213 townships which have yet to benefit from any FSC activities. The effects of the current crisis in Myanmar have not been determined by an epicentre or a stormpath and there is no programmatic rationale for the response to be so uneven. This advocacy should be targetted at the ICCG, Cluster partners, other Clusters and at donors.

  5. Collect 5W data from other clusters so that multi-sector coverage may be reviewed. Clean and process conflict data so that it may be cross-referenced with partners’ coverage.

  6. Work with partners to determine their current capacities to submit age and sex-disaggregated beneficiary data. Develop a workplan to ensure that they can meet reporting requirements.

  7. Solicit monitoring reports from partners and explore the possibility of joint monitoring.

  8. Revise the 5W template – in consultation with partners – in order to address the data collection issues identified.



6. Reference table – township-level



7. Reference map – township-level

LS0tDQp0aXRsZTogIkluaXRpYWwgcmVwb3J0IG9uIHRoZSBNeWFubWFyIEZvb2QgU2VjdXJpdHkgNVdzIg0KYXV0aG9yOiAiU2VhbiBOZyINCmRhdGU6ICIyMi8wMS8yMDIxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvbGxhcHNlZDogZmFsc2UNCi0tLQ0KDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQoNCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICIiOw0KICBkaXNwbGF5OiBibG9jazsNCiAgaGVpZ2h0OiA3MHB4Ow0KICBtYXJnaW46IDJlbSAyMHB4IDQwcHggMjBweDsNCiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJNeWFubWFyX2NsdXN0ZXJfYmx1ZS5wbmciKTsNCiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOw0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7DQogICAgICAgIG1heC13aWR0aDogMTI4MHB4Ow0KICAgIH0NCjwvc3R5bGU+DQpgYGANCg0KIyMgSW50cm9kdWN0aW9uDQoNClRoaXMgcmVwb3J0IGlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBpbml0aWFsIG9ic2VydmF0aW9ucyBhbmQgYW5hbHlzaXMgcGVyZm9ybWVkIG9uIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgNVdzIGRhdGEgZm9yIHRoZSBmaXJzdCB0aHJlZS1xdWFydGVycyBvZiAyMDIxOyB0aGUgaXNzdWVzIGlkZW50aWZpZWQgYW5kIGFuYWx5c2lzIGhhdmUgYmVlbiBicm9rZW4gaW50byBsYXJnZSBncm91cHMgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBmaXJzdCA0IGNoYXB0ZXJzIC0tIGFuYWx5c2lzIGJ5IGdlb2dyYXBoeSwgYWN0aXZpdGllcyBhbmQgbW9kYWxpdGllcywgcGFydG5lcnMgYW5kIGJlbmVmaWNpYXJpZXMuIFRoaXMgcmVwb3J0IGVuZHMgd2l0aCBhIGJyaWVmIHNlY3Rpb24gb24gbmV4dCBzdGVwcyBhbmQgYW4gaW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGFuZCByZWZlcmVuY2UgbWFwLiANCg0KV2UgaGF2ZSBlbmRlYXZvdXJlZCB0byBwcm92aWRlIGFjdGlvbmFibGUgaW5mb3JtYXRpb24gYW5kIGJlbGlldmUgdGhhdCByZWxlYXNpbmcgdGhpcyByZXBvcnQgaXMgYSBuZWNlc3NhcnkgcGFydCBvZiBqdW1wc3RhcnRpbmcgdGhlIHByb2Nlc3Mgb2YgcmVzb2x2aW5nIHRoZSBtb3JlIHByZXNzaW5nIGNvbmNlcm5zIGlkZW50aWZpZWQuIEZ1cnRoZXIgYW5hbHlzaXMgaXMgbWVyaXRlZCBpbiBzZXZlcmFsIGFyZWFzOyBhbmQgdGhpcyB3aWxsIGJlIHVuZGVydGFrZW4gb25jZSBjb25zdWx0YXRpb25zIHdpdGggcGFydG5lcnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4gDQoNClVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCBiZW5lZmljaWFyeSBmaWd1cmVzIGluIHRoaXMgcmVwb3J0IGFyZSB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBiZW5lZmljaWFyaWVzLCBhcyBvcHBvc2VkIHRvIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzLiANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShwYW5kZXIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGZ1enp5am9pbikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGJvb2tkb3duKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShnZ3NmbGFiZWwpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShEVCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIHJlYWRpbmcgaW4gdG93bnNoaXBzIGZyb20gZ2VvYWRtaW5zIA0KdG93bnNoaXBzIDwtIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLA0KICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QoYWRtaW4xcGNvZGVfNDphZG1pbjNwY29kZSkgJT4lIA0KICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfNCwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluM3Bjb2RlLA0KICAgICAgICAgc3RhdGVfbmFtZSAgID0gc3RhdGVfNSwNCiAgICAgICAgIHRvd25zaGlwX25hbWUgID0gY291bnR5KSAlPiUgDQogIHJlbW92ZV9lbXB0eSgpDQoNCiMgbG9jYXRpb25zIGRhdGFzZXQgDQpsb2NhdGlvbnMgPC0gYmluZF9yb3dzKA0KICANCiAgcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsICMgcGF5YW1zIA0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3Qoc3RhdGVfbmFtZTpwYXlhbV9jb2RlKSAlPiUgDQogICAgcmVuYW1lKGFkbWluMV9wY29kZSA9IHN0YXRlX2NvZGVfMTIsDQogICAgICAgICAgIHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZSwgDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IGNvdW50eV9jb2RlLA0KICAgICAgICAgICBsb2NhdGlvbiA9IHBheWFtX25hbWUpICU+JQ0KICAgIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IHBhc3RlMCgicGF5YW0iKSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBjYW1wcw0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICBzZWxlY3QoY291bnR5X25hbWUxOnBfY29kZV9jYW1wKSAlPiUgDQogICAgcmVuYW1lKHRvd25zaGlwX25hbWUgPSBjb3VudHlfbmFtZTEsDQogICAgICAgICAgIGFkbWluM19wY29kZSA9IHN0YXRlX2NvZGVfMjMsDQogICAgICAgICAgIGxvY2F0aW9uID0gY2FtcHMsIA0KICAgICAgICAgICBjYW1wX3Bjb2RlID0gcF9jb2RlX2NhbXApICU+JSANCiAgICByZW1vdmVfZW1wdHkoKSAlPiUgDQogICAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBwYXN0ZTAoImNhbXAiKSkgJT4lIA0KICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSksIA0KICAgICAgICAgICAgICBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogICAgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogICAgcmVsb2NhdGUoc3RhdGVfbmFtZSksDQogIA0KICByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwgIyBpbmR1c3RyaWFsIHpvbmVzDQogICAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgc2VsZWN0KHN0YXRlXzI4OmluZHVzdHJpYWxfem9uZXMpICU+JSANCiAgICByZW5hbWUoc3RhdGVfbmFtZSA9IHN0YXRlXzI4LCANCiAgICAgICAgICAgYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfMjksDQogICAgICAgICAgIGxvY2F0aW9uID0gaW5kdXN0cmlhbF96b25lcykgJT4lDQogICAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICAgIHJlZ2V4X2xlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgICAgICAgICBieSA9IGMoImxvY2F0aW9uIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgICAjIHJlcGxhY2luZyB0aGUgTkFzIHdpdGggMHMgc28gdGhlIGZpbHRlciBkb2Vzbid0IGRyb3AgdGhlbSANCiAgICByZXBsYWNlX25hKGxpc3QodG93bnNoaXBfbmFtZSA9IDAsIGFkbWluM19wY29kZSA9IDAsIGFkbWluMV9wY29kZSA9IDApKSAlPiUNCiAgICBmaWx0ZXIoYWRtaW4zX3Bjb2RlICE9ICJNTVIwMTMwNDAiKSAlPiUgIyByZW1vdmluZyBhbGwgdGhlIG1hdGNoZXMgYmV0d2VlbiBIbGFpbmd0aGFyeWEgYW5kIEhsYWluZw0KICAgIGZpbHRlcihhZG1pbjNfcGNvZGUgIT0gIk1NUjAxMTAwNiIpICU+JSAjIHJlbW92aW5nIGFsbCB0aGUgbWF0Y2hlcyBiZXR3ZWVuIFllbmFuZ3lhdW5nIGFuZCBZZQ0KICAgIG11dGF0ZShsb2NhdGlvbl90eXBlID0gcGFzdGUwKCJpbmR1c3RyaWFsX3pvbmUiKSkNCiAgDQopJT4lDQogIG11dGF0ZShsb2NhdGlvbl9jb2RlID0gY2FzZV93aGVuKGxvY2F0aW9uX3R5cGUgPT0gImNhbXAiIH4gY2FtcF9wY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAicGF5YW0iIH4gcGF5YW1fY29kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fdHlwZSA9PSAiaW5kdXN0cmlhbF96b25lIiB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUNCiAgbXV0YXRlKGxvY2F0aW9uc19mdXp6eSA9IHN0cl9yZXBsYWNlX2FsbChsb2NhdGlvbiwgIltbOnB1bmN0Ol1dIiwgIiIpKQ0KDQojIHJlYWRpbmcgaW4gNXdzDQpmc2MgPC0gcmVhZF9leGNlbCgNCiAgIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsMTlfKGluY2x1ZGVkIEFsbCBJUCBSZXBvcnRzKV9KYW4gdG8gU2VwIDIwMjFfSU0gQ29tYmluZWRfRmluYWwueGxzeCIsDQogICAgICAgICAgICAgICAgICBzaGVldCA9ICJGU0MgNVcgQWN0aXZpdGVzIiwNCiAgICAgICAgICAgICAgICAgIHNraXAgPSA1KSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QobW9udGhfb2ZfaW1wbGVtZW50YXRpb246aHJwX3ZlcnNpb24pICU+JSANCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyX29mXyIsICIiKSkgJT4lDQogIHJlbmFtZV9hbGwofnN0cl9yZXBsYWNlX2FsbCguLCAiXm51bWJlcl8iLCAiIikpICU+JSANCiAgcmVuYW1lKGFkbWluNF9wY29kZSA9IGFkbWluM19wY29kZSwgDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjJfcGNvZGUsDQogICAgICAgICBiZW5lZmljaWFyaWVzID0gcmVhY2hlZF9iZW5lZmljaWFyaWVzLA0KICAgICAgICAgaG91c2Vob2xkcyA9IHJlYWNoZWRfaG91c2Vob2xkcywNCiAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgPSBiZW5lZmljaWFyaWVzX3R5cGUpICU+JSANCiAgbXV0YXRlKGluZHVzdHJpYWxfem9uZXMgPSByZXBsYWNlKGluZHVzdHJpYWxfem9uZXMsIGluZHVzdHJpYWxfem9uZXMgPT0gIk5vIiwgTkEpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVwbGFjZShmcmVxdWVuY3ksIGZyZXF1ZW5jeSA9PSAiTi9BIiwgTkEpKSAlPiUgDQogIG11dGF0ZShsb2NhdGlvbiA9IGNhc2Vfd2hlbihjYW1wICE9ICJOQSIgfiBjYW1wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gaW5kdXN0cmlhbF96b25lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2Vfd2FyZF90b3duICE9ICJOQSIgfiB2aWxsYWdlX3dhcmRfdG93bikpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBjYXNlX3doZW4oY2FtcCAhPSAiTkEiIH4gImNhbXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gImluZHVzdHJpYWxfem9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWxsYWdlX3dhcmRfdG93biAhPSAiTkEiIH4gInZpbGxhZ2Vfd2FyZF90b3duIikpICU+JQ0KICBtdXRhdGUobG9jYXRpb25zX2Z1enp5ID0gc3RyX3JlcGxhY2VfYWxsKGxvY2F0aW9uLCAiW1s6cHVuY3Q6XV0iLCAiICIpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF92YWx1ZV9tbWsgPSB2YWx1ZV9wZXJfaG91c2Vob2xkICogaG91c2Vob2xkcykgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG15KG1vbnRoX29mX2ltcGxlbWVudGF0aW9uKSkgJT4lIA0KICBtdXRhdGUodV9iZW4gPSBpZmVsc2UodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIsIGJlbmVmaWNpYXJpZXMsIDApKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKHN0YXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2FjaGluIiA9ICJrYWNoaW4iKSkpICU+JSANCiAgbXV0YXRlKG1ta19oaGRfYmluID0gY2FzZV93aGVuKHZhbHVlX3Blcl9ob3VzZWhvbGQgPCAxMDAwMCB+ICJiZWxvd18xMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDEwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSAyMDAwMCB+ICIxMGtfMjBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDIwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA1MDAwMCB+ICIyMGtfNTBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDUwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8PSA3MDAwMCB+ICI1MGtfNzBrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZCA+IDcwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDEwMDAwMCB+ICI3MGtfMTAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPj0gMTAwMDAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZCA8IDIwMDAwMCB+ICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wZXJfaG91c2Vob2xkID49IDIwMDAwMCAmIHZhbHVlX3Blcl9ob3VzZWhvbGQgPD0gMzAwMDAwIH4gIjIwMGtfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGQgPiAzMDAwMDAgfiAiYWJvdmVfMzAwayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSwNCiAgICAgICAgIG1ta19oaGRfYmluID0gZmN0X3JlbGV2ZWwobW1rX2hoZF9iaW4sIGMoImxlc3NfdGhhbl8xMGsiLCAiMTBrXzIwayIsIjIwa181MGsiLCAiNTBrXzcwayIsICI3MGtfMTAwayIsICIxMDBrXzIwMGsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMGtfMzAwayIsIm1vcmVfdGhhbl8zMDBrIikpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVjb2RlKGZyZXF1ZW5jeSwgIm1vbnRobHkiID0gIk1vbnRobHkiKSkgJT4lDQogIG11dGF0ZSh1c2RfaGhkX2JpbiA9IA0KICAgICAgICAgICBjYXNlX3doZW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAxMCB+ICI8JDEwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDEwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAyMCB+ICI+PSQxMF88JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDIwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCA0MCB+ICI+PSQyMF88JDQwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDQwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCA2MCB+ICI+PSQ0MF88JDYwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDYwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAxMDAgfiAiPj0kNjBfPCQxMDAiLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPj0gMTAwICYgdmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPCAyMDAgfiAiPj0kMTAwXzwkMjAwIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Blcl9ob3VzZWhvbGRfdXNkID49IDIwMCB+ICI+PSQyMDAiLA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLA0KICAgICAgICAgdXNkX2hoZF9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfaGhkX2JpbiwgYygiPCQxMCIsICI+PSQxMF88JDIwIiwgIj49JDIwXzwkNDAiLCAiPj0kNDBfPCQ2MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kNjBfPCQxMDAiLCAiPj0kMTAwXzwkMjAwIiwgIj49JDIwMCIpKSkgJT4lIA0KICBtdXRhdGUoaHJwX2luZGljYXRvciA9DQogICAgICAgICAgcmVjb2RlKGhycF9pbmRpY2F0b3IsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIgPSANCiAgICAgICAgICAgICIxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2UiLA0KICAgICAgICAgICJOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0LCBjb250cmlidXRpbmcgdG8gaG91c2Vob2xkIGZvb2Qgc2VjdXJpdHkiID0NCiAgICAgICAgICAgICIyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBzdHJfdHJpbShiZW5lZmljaWFyeV90eXBlKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgICAgICAgIlJha2hpbmUgc3RhdGVsZXNzIiA9ICJOb24tZGlzcGxhY2VkIHN0YXRlbGVzcyBwZW9wbGUgaW4gUmFraGluZSIpKSkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHkgPSByZWNvZGUoYWN0aXZpdHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyB0aHJvdWdoIGluLWtpbmQgYXNzaXN0YW5jZSB0byBhY3V0ZWx5IGZvb2QgaW5zZWN1cmUgcG9wdWxhdGlvbiBpbiBydXJhbCBhcmVhcyIgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGZvb2QgYmFza2V0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIHRlY2huaWNhbCB0cmFpbmluZyAoYWdyaWN1bHR1cmUsIGxpdmVzdG9jayBicmVlZGluZywgbGl2ZWxpaG9vZCkiID0gIlByb3ZpZGUgdGVjaG5pY2FsIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgc3VwcG9ydCBmb3IgSW5jb21lIEdlbmVyYXRpbmcgQWN0aXZpdGllcyIgPSAiUHJvdmlkZSBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgdG8gYWN1dGVseSBmb29kIGluc2VjdXJlIHBvcHVsYXRpb24gaW4gcnVyYWwgYXJlYXMiID0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhc2ggZm9yIFdvcmsgLyBGb29kIGZvciBBc3NldHMgYWN0aXZpdGllcyIgPSAiQ2FzaCBmb3IgV29yayAvIEZvb2QgZm9yIEFzc2V0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIGZpc2hlcnkga2l0cyAoaW4ta2luZCAvIENCVCkiID0gIlByb3ZpZGUgZmlzaGVyeSBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgY3JvcHMgJiB2ZWdldGFibGVzIGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGNyb3BzICYgdmVnZXRhYmxlcyBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbGl2ZXN0b2NrIGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGxpdmVzdG9jayBraXRzIikpDQoNCg0KIyBiZW4gZGF0YXNldCAtLSB0aWR5IGZvcm1hdCA1V3MgZm9yIGJlbmVmaWNpYXJpZXMgDQpiZW4gPC0gZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgIA0KICBzZWxlY3QoZGF0ZSwNCiAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVycywgaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSwNCiAgICAgICAgIHN0YXRlLCB0b3duc2hpcCwgdmlsbGFnZV93YXJkX3Rvd24sIGxvY2F0aW9uLCBsb2NhdGlvbl90eXBlLCBhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSwNCiAgICAgICAgIGFjdGl2aXR5LCBhY3Rpdml0eV9zdGF0dXMsIGhycF9pbmRpY2F0b3IsIGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgY2hpbGRfbWFsZSwgY2hpbGRfZmVtYWxlLCBhZHVsdF9tYWxlLCBhZHVsdF9mZW1hbGUsIGVsZGVybHlfbWFsZSwgZWxkZXJseV9mZW1hbGUpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjaGlsZF9tYWxlOmVsZGVybHlfZmVtYWxlLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImRpc2FnZ3JlZ2F0aW9uIiwgdmFsdWVzX3RvID0gImJlbmVmaWNpYXJpZXMiLCB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpDQogDQoNCiMgcmVhZGluZyBpbiBwaW4gYW5kIHRhcmdldHMNCnBpbiA8LSByZWFkX2V4Y2VsKCJQSU4gY2FsY3VsYXRpb24gRm9vZCBTZWN1cml0eSBDbHVzdGVyX1Rvd25zaGlwIEJyZWFrZG93bi54bHN4IiwNCiAgICAgICAgICAgc2hlZXQgPSAiRm9vZCBTZWMgUGlOIHdpdGggSURQcyIsIA0KICAgICAgICAgICBza2lwID0gMikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KC1jKHgxNywgeDE4LCB4MTkpKSAlPiUgDQogIHNsaWNlKDE6MzQ2KSAlPiUgDQogIGZpbGwocmVnaW9uKSAlPiUgDQogIHJlbmFtZShzdGF0ZSA9IHJlZ2lvbiwNCiAgICAgICAgIGlkcHMgPSBpZF9wcywgDQogICAgICAgICBwb3BfbWludXNfaWRwcyA9IHBvcHVsYXRpb25fbWludXNfaWRfcHMsIA0KICAgICAgICAgcGluXzIwMjIgPSB2dWxuZXJhYmxlX2Zvb2RfaW5zZWN1cmVfcGVvcGxlX2lkX3BzKSAlPiUgIA0KICBmaWx0ZXIodG93bnNoaXAgIT0gIlRvdGFsIikgJT4lICANCiAgbXV0YXRlX2F0KHZhcnMocG9wX21pbnVzX2lkcHM6bW9kZXJhdGVseV9zZXZlcmVseSksIH4gYXMubnVtZXJpYyguKSkgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzLCBieSA9IGMoInRvd25zaGlwIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgc2VsZWN0KC1zdGF0ZSkgJT4lICANCiAgcmVsb2NhdGUoYWRtaW4zX3Bjb2RlKSAlPiUgcmVsb2NhdGUoc3RhdGUgPSBzdGF0ZV9uYW1lKSAlPiUgcmVsb2NhdGUoYWRtaW4xX3Bjb2RlKSAlPiUgDQogIG11dGF0ZShwY192dWwgPSBwaW5fMjAyMiAvIHRvdGFsX3BvcCwNCiAgICAgICAgIHBpbl8yMDIyID0gcm91bmQocGluXzIwMjIsIGRpZ2l0cyA9IDApKSAlPiUgDQogIGxlZnRfam9pbihyZWFkX2V4Y2VsKCJGU0MgUElOIGFuZCBUYXJnZXQgX2NvbWJpbmUgSFJQIGFuZCBJRVJQIDIwMjEueGxzeCIpICU+JQ0KICAgICAgICAgICAgICBjbGVhbl9uYW1lcygpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zX3Bjb2RlID0gdHNwX3Bjb2RlLCBwaW5fMjAyMSA9IHBpbiwgdGFyZ2V0XzIwMjEgPSB0YXJnZXQpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihyZWFkX2V4Y2VsKCJmc190YXJnZXRzXzIwMjEueGxzeCIpICU+JQ0KICAgICAgICAgICAgICBjbGVhbl9uYW1lcygpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KHRvd25zaGlwID0geDEsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X2lkcHNfMjAyMSA9IGludGVybmFsbHlfZGlzcGxhY2VkX3BlcnNvbnNfMTIsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X3JldHVybmVlc18yMDIxID0gaWRwX3JldHVybmVlc19yZXNldHRsZWRfbG9jYWxseV9pbnRlZ3JhdGVkXzEzLA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9zdGF0ZWxlc3NfcmFraGluZV8yMDIxID0gbm9uX2Rpc3BsYWNlZF9zdGF0ZWxlc3NfcGVvcGxlX2luX3Jha2hpbmVfMTQsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X290aGVyX3Z1bG5lcmFibGVfMjAyMSA9IG90aGVyX3Z1bG5lcmFibGVfY3Jpc2lzX2FmZmVjdGVkX3Blb3BsZV8xNSwNCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfdG90YWwgPSB0b3RhbF8xNikgJT4lDQogICAgICAgICAgICAgIGxlZnRfam9pbih0b3duc2hpcHMgJT4lICBzZWxlY3QodG93bnNoaXBfbmFtZSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSBjKCJ0b3duc2hpcCIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtdG93bnNoaXApLA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAgICANCg0KDQojIHNoYXBlZmlsZXMNCnBjb2RlM19zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KICByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSwNCiAgICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBUU19QQ09ERSkNCg0KcGNvZGUxX3NoYXBlIDwtIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUpDQoNCiMgZm9yIHJlbGV2ZWxsaW5nIC0tIHRoaXMgaXMgaW4gb3JkZXIgb2YgYmVuZWZpY2lhcmllcw0Kc3Jfb3JkIDwtIGMoIllhbmdvbiIsICJSYWtoaW5lIiwgIkthY2hpbiIsICJTaGFuIChOb3J0aCkiLCAiQXlleWFyd2FkeSIgLCAiS2F5aW4iLCAiTW9uIiwgIk1hbmRhbGF5IiwNCiAgICAgICAgICAgICJLYXlhaCIsICJDaGluIiwgIlNoYW4gKFNvdXRoKSIsICJTYWdhaW5nIiwgIkJhZ28gKEVhc3QpIiwgIk1hZ3dheSIsICJTaGFuIChFYXN0KSIsICJCYWdvIChXZXN0KSIsICJUYW5pbnRoYXJ5aSIpDQoNCiMgZm9yIHByaW50aW5nIHRoZSB0YXJnZXRzIG9mIHRoZSBwaW4gDQp0YXJnZXRfYmVuXzIwMjEgPC0gcGluICU+JSAgDQogIHNlbGVjdChhZG1pbjNfcGNvZGUsIHN0YXRlLCB0b3duc2hpcCwgdGFyZ2V0XzIwMjEpICU+JSANCiAgZmlsdGVyKHRhcmdldF8yMDIxID4gMCkgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUocGNfcmVhY2hlZCA9IGJlbmVmaWNpYXJpZXMgLyB0YXJnZXRfMjAyMSAqIDEwMCkgJT4lICANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgDQoNCmBgYA0KDQoNCiMjIDEuIEdlb2dyYXBoaWNhbCBjb3ZlcmFnZQ0KDQojIyMgMS4xIENvbXBhcmluZyBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYW5kIDIwMjEgUElOIGJ5IHN0YXRlIGFuZCByZWdpb24NCg0KQSB0b3RhbCBvZiBgciBzdW0oYmVuJGJlbmVmaWNpYXJpZXMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB1bmlxdWUgYmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gcmVhY2hlZCBhY3Jvc3MgdGhlIGNvdW50cnk7IHRoaXMgaXMgYHIgcm91bmQoc3VtKGJlbiRiZW5lZmljaWFyaWVzKSAvIHN1bShwaW4kdGFyZ2V0XzIwMjEpICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSB0YXJnZXR0ZWQgYHIgc3VtKHBpbiR0YXJnZXRfMjAyMSkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnM7IGhvd2V2ZXIsIG5vdCBhbGwgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBjb3JyZXNwb25kZWQgdG8gYXJlYXMgd2hlcmUgdGhlcmUgd2VyZSB0YXJnZXRzIC0tIHRoaXMgaXMgZXhwbG9yZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdG93bnNoaXBzLg0KDQo8YnI+DQoNCg0KYGBge3IgYmFycGxvdC1zdGF0ZS1iZW5lZmljaWFyaWVzLXBpbn0NCiMgYWRkIGEgdGhpcmQgY29sdW1uIGZvciB0YXJnZXQgZm9yIGFsbCB0aGUgYmFycGxvdHMgDQpwaW4gJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgMCwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdGFyZ2V0XzIwMjEgPSBzdW0odGFyZ2V0XzIwMjEpLCANCiAgICAgICAgICAgIHBpbl8yMDIxID0gc3VtKHBpbl8yMDIxKSkgJT4lIA0KICBmaWx0ZXIocGluXzIwMjEgPiAwIHwgYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgcGl2b3RfbG9uZ2VyKC1zdGF0ZSwgbmFtZXNfdG8gPSAidHlwZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3JlbGV2ZWwoc3RhdGUsIHNyX29yZCksIHkgPSB2YWx1ZSwgZmlsbCA9IGZjdF9yZWxldmVsKHR5cGUsIGMoImJlbmVmaWNpYXJpZXMiLCAidGFyZ2V0XzIwMjEiLCAicGluXzIwMjEiKSkpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC40LCBhbmdsZSA9IDcwKSkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgYW5kIHBlb3BsZSBpbiBuZWVkICgyMDIxKSIpICsNCiAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjAwMDAwMCwgYnkgPSAyMDAwMDApLCBsYWJlbHMgPSBjb21tYSkNCmBgYA0KDQo8YnI+DQoNCiMjIyAxLjIgVGFibGUgb2YgYmVuZWZpY2lhcmllcyBhbmQgUElOIGJ5IHN0YXRlIGFuZCByZWdpb24NCg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyaWVzLXBpbi1zdGF0ZX0NCiMgY2hhbmdlIGZvcm11bGFzIHRvIGxvb2sgYXQgJSBvZiB0YXJnZXQgYW5kIHNob3cgUElOLCB0YXJnZXQgYW5kIGFjaGlldmVtZW50IGluIHRoZSB0YWJsZSANCnBpbiAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpZXMpLCAwLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICB0YXJnZXQgPSByb3VuZChzdW0odGFyZ2V0XzIwMjEpLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICAgICBQSU4gPSByb3VuZChzdW0ocGluXzIwMjEpLCBkaWdpdHMgPSAwKSkgJT4lDQogIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCB8IFBJTiA+IDApICU+JSANCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX3RhcmdldF9yZWFjaGVkYCA9IGlmZWxzZShpcy5pbmZpbml0ZShiZW5lZmljaWFyaWVzIC8gdGFyZ2V0ICogMTAwKSwgTkFfcmVhbF8sIGJlbmVmaWNpYXJpZXMgLyB0YXJnZXQgKiAxMDApLA0KICAgICAgICAgYCVfdGFyZ2V0X3JlYWNoZWRgID0gcm91bmQoYCVfdGFyZ2V0X3JlYWNoZWRgLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSByb3VuZCh0YXJnZXQgLyBzdW0odGFyZ2V0KSAqIDEwMCwgZGlnaXRzID0gMikpICAlPiUgDQogIHJlbG9jYXRlKGAlX29mX2JlbmAsIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgcmVsb2NhdGUoYCVfdGFyZ2V0X3JlYWNoZWRgLCAuYWZ0ZXIgPSB0YXJnZXQpICU+JSANCiAgcmVsb2NhdGUoYCVfb2ZfdGFyZ2V0YCwgLmFmdGVyID0gdGFyZ2V0KSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhbmQgUElOIGJ5IHN0YXRlL3JlZ2lvbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQpgYGANCg0KPGJyPg0KDQpZYW5nb24gYW5kIFJha2hpbmUgZm9ybSBib3RoIDgyJSBvZiB0aGUgdGFyZ2V0IGFuZCA4MiUgb2YgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gTWFuZGFsYXkgaGFzIGhhcyB0aGUgbGFyZ2VzdCBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0cyBhbmQgYmVuZWZpY2lhcmllcyByZWFjaGVkLiBUaGVyZSB3ZXJlIGZvdXIgc3RhdGVzIChBeWV5YXJ3YWR5LCBNb24sIFNhZ2FpbmcgYW5kIE1hZ3dheSkgd2hlcmUgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgYnV0IHdlcmUgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIDIwMjEgdGFyZ2V0IG9yIFBJTjsgaG93ZXZlciwgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiB0aGVzZSBhcmVhcyByZXByZXNlbnQgbGVzcyB0aGFuIDUlIG9mIGFsbCBiZW5lZmljaWFyaWVzIHJlYWNoZWQuIEFkZGl0aW9uYWxseSwgdGFyZ2V0cyBoYXZlIGJlZW4gZXhjZWVkZWQgaW4gNyBzdGF0ZXMsIHdpdGggS2F5aW4gaGF2aW5nIHJlYWNoZWQgNjg0JSBvZiBpdHMgdGFyZ2V0IG9mIDYsODU1IHBlcnNvbnMuIA0KDQpIb3dldmVyLCBtb3ZpbmcgZm9yd2FyZCwgdGhlIFBJTiBmb3IgMjAyMiBpcyBtdWNoIG1vcmUgZXZlbmx5IHNwcmVhZCBhY3Jvc3MgdGhlIGNvdW50cnk6IHdpdGggcmVmZXJlbmNlIHRvIHRoZSBwbG90IGJlbG93LCBZYW5nb24sIGFsb25nIHdpdGggTWFnd2F5IGFuZCBNYW5kYWxheSBoYXZlIHNvbWUgb2YgdGhlIGxvd2VzdCBwcm9wb3J0aW9ucyBvZiB2dWxuZXJhYmxlIHBlcnNvbnMgaW4gcmVsYXRpb24gdG8gdGhlIHRvdGFsIHN0YXRlIHBvcHVsYXRpb24sIG1lYW5pbmcgdGhhdCBjYXJlZnVsIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBhbmQgdGlnaHQgdnVsbmVyYWJpbGl0eSBpbiB0aGVzZSBhcmVhcyB3aWxsIG5lY2Vzc2FyeSB0byBhdm9pZCBleGNlc3NpdmUgaW5jbHVzaW9uIGVycm9ycy4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1waW4tdnVsLXN0YXRlfQ0KcGluICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgZmlsdGVyKHN0YXRlICE9ICJOYXkgUHlpIFRhdyIpICU+JSANCiAgc3VtbWFyaXNlKHBpbl8yMDIyID0gcm91bmQoc3VtKHBpbl8yMDIyKSksDQogICAgICAgICAgICB0b3RhbF9wb3AgPSBzdW0odG90YWxfcG9wKSkgJT4lIA0KICBtdXRhdGUoYHZ1bG5lcmFibGUlYCA9IHJvdW5kKHBpbl8yMDIyIC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIHN0YXRlID0gcmVvcmRlcihzdGF0ZSwgLWB2dWxuZXJhYmxlJWApKSAgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBzdGF0ZSwgeSA9IHBpbl8yMDIyLCBmaWxsID0gYHZ1bG5lcmFibGUlYCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBgdnVsbmVyYWJsZSVgKSwgc2l6ZSA9IDIuNSwgdmp1c3QgPSAtMC41KSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDAuNikpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgcGVvcGxlIGluIG5lZWQiLCANCiAgICAgICB0aXRsZSA9ICIyMDIyIFBJTiBhbmQgaW5jaWRlbmNlIG9mIHZ1bG5lcmFiaWx0eSBieSBzdGF0ZSBhbmQgcmVnaW9uIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJWdWxuZXJhYmlsaXR5IGlzIGRlZmluZWQgaGVyZSBhcyB0aGUgcHJvcG9ydGlvbiBvZiBhIHBvcHVsYXRpb24gd2hvIGFyZSBmb29kIGluc2VjdXJlIG9yIGFyZSBJRFBzIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIwMDAwMDAsIGJ5ID0gMjAwMDAwKSwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHRyYW5zID0gInJldmVyc2UiKQ0KYGBgDQoNCjxicj4NCg0KDQojIyMgMS4zIFRvd25zaGlwLWxldmVsIGRpc3RyaWJ1dGlvbiBvZiBiZW5lZmljaWFyaWVzDQoNCkp1c3QgYXMgdGhlIHJlc3BvbnNlIGlzIGhlYXZpbHkgd2VpZ2h0ZWQgdG93YXJkcyBZYW5nb24gYW5kIFJha2hpbmUgYXQgdGhlIHN0YXRlIGFuZCByZWdpb24gbGV2ZWwsIHRoZSBzYW1lIGlzIHRydWUgYXQgdGhlIHRvd25zaGlwIGxldmVsIGFzIHdlbGwuIFRoZXNlIDEwIHRvd25zaGlwcyBiZWxvdyBhcmUgd2hlcmUgODAlIG9mIGJlbmVmaWNpYXJpZXMgaGF2ZSBiZWVuIHJlYWNoZWQgY29sbGVjdGl2ZWx5LCB0aGV5IHJlcHJlc2VudCA1MyUgb2YgdGhlIDIwMjEgdGFyZ2V0LiBJbiBwYXJ0aWN1bGFyLCBIbGFpbmd0aGFyeWEgaGFzIGJlbmVmaWNpYXJ5IGZpZ3VyZXMgdGhhdCBhcmUgMzc4JSBvZiBpdHMgdGFyZ2V0LiBBZGRpdGlvbmFsbHksIG5laXRoZXIgS2F3YXJlaWsgaW4gS2F5aW4gb3IgS3lhaWttYXJhdyBpbiBNb24gd2VyZSB0YXJnZXR0ZWQgYXMgcGFydCBvZiB0aGUgMjAyMSBQSU4gZGVzcGl0ZSBiZWluZyBpbiB0aGUgdG9wIDEwIHRvd25zaGlwcyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgLS0gb25seSA4OC41JSBvZiBiZW5lZmljaWFyaWVzIGNvcnJlc3BvbmRlZCB0byB0b3duc2hpcHMgd2l0aCB0YXJnZXRzLiAgDQoNCmBgYHtyIHRhYmxlLXRvcC10b3duc2hpcHMtYmVuZWZpY2lhcmllc30NCiMgY2hlY2sgdGhlIHBhcmFncmFwaCB0ZXh0IGFib3ZlIGlmIHlvdSByZXJ1biB0aGUgcmVwb3J0IG9uIG5ldyBkYXRhIA0KYmVuICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlLCB0b3duc2hpcCwgc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKHBpbiAlPiUgc2VsZWN0KGFkbWluM19wY29kZSwgdGFyZ2V0ID0gdGFyZ2V0XzIwMjEpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgbXV0YXRlKGAlX29mX2JlbmAgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSBpZmVsc2UoaXMuaW5maW5pdGUodGFyZ2V0IC8gc3VtKHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMCksIE5BX3JlYWxfLCB0YXJnZXQgLyBzdW0odGFyZ2V0LCBuYS5ybSA9IFRSVUUpICogMTAwKSwNCiAgICAgICAgIGAlX29mX3RhcmdldGAgPSByb3VuZChgJV9vZl90YXJnZXRgLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIGAlcmVhY2hlZGAgPSBpZmVsc2UoaXMuaW5maW5pdGUoYmVuZWZpY2lhcmllcyAvIHRhcmdldCAqIDEwMCksIE5BX3JlYWxfLCBiZW5lZmljaWFyaWVzIC8gdGFyZ2V0ICogMTAwKSwNCiAgICAgICAgIGAlcmVhY2hlZGAgPSByb3VuZChgJXJlYWNoZWRgLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoLWFkbWluM19wY29kZSkgJT4lIA0KICByZWxvY2F0ZShgJV9vZl9iZW5gLCAuYWZ0ZXIgPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIHJlbG9jYXRlKHN0YXRlLCAuYWZ0ZXIgPSB0b3duc2hpcCkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgaGVhZCgxMCkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJUb3AgMTAgdG93bnNoaXBzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIxIikNCmBgYA0KDQo8YnI+DQoNCmByIGJlbiAlPiUgc2VsZWN0KHRvd25zaGlwKSAlPiUgZGlzdGluY3QoKSAlPiUgbnJvdygpYCB0b3duc2hpcHMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgZm9vZCBzZWN1cml0eSBhY3Rpdml0aWVzIGluIHRoZSBmaXJzdCB0aHJlZS1xdWFydGVycyBvZiAyMDIxLiBUaGlzIGlzIGxlc3MgdGhhbiBhIHRoaXJkIG9mIHRoZSAzMzAgdG93bnNoaXBzIGluIHRoZSBjb3VudHJ5LiBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhyZWUgdG93bnNoaXBzIC0tIEhwYXB1biBpbiBLYXlpbiwgTXVzZSBpbiBTaGFuIChOb3J0aCkgYW5kIEt5ZXRoaSBpbiBTaGFuIChTb3V0aCkgaGF2ZSBiZWVuIHRhcmdldHRlZCBzaW5jZSB0aGUgaW5pdGlhbCAyMDIxIEhSUCwgeWV0IGhhdmUgbm90IGJlZW4gcmVhY2hlZCBieSBhbnkgRlNDIGFjdGl2aXRpZXM7IDEwIHRvd25zaGlwcywgb3ZlcmFsbCwgaW4gZWl0aGVyIHRoZSBIUlAgb3IgSUVSUCwgaGF2ZSBub3QgYmVuZWZpdHRlZCBmcm9tIGFueSBGU0MgYWN0aXZpdGllcy4gDQoNCk92ZXJhbGwsIGByIHJvdW5kKHN1bSh0YXJnZXRfYmVuXzIwMjEkYmVuZWZpY2lhcmllcykgLyBzdW0odGFyZ2V0X2Jlbl8yMDIxJHRhcmdldF8yMDIxKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiB0aGUgdGFyZ2V0dGVkIHBvcHVsYXRpb24gd2FzIHJlYWNoZWQuIEZyb20gdGhlIGhpc3RvZ3JhbSBiZWxvdywgd2UgY2FuIHNlZSB0aGF0IG92ZXJyZWFjaCBhbmQgdW5kZXItcmVhY2hpbmcgYXJlIHZlcnkgY29tbW9uIGF0IHRoZSB0b3duc2hpcCBsZXZlbCAtLSB0b3duc2hpcHMgYXJlIGNvbW1vbmx5IGNsdXN0ZXJlZCBhdCBhcm91bmQgMCUgcmVhY2hlZCBhbmQgYWxzbyBhdCAyMDAlIHJlYWNoZWQgb3IgbW9yZS4gT2YgdGhlIDUxIHRvd25zaGlwcyB0YXJnZXR0ZWQgaW4gMjAyMTsgMjEgdG93bnNoaXBzIHJlYWNoZWQgbW9yZSB0aGFuIDEyMCUgb2YgdGhlaXIgdGFyZ2V0LCA0IHJlYWNoZWQgYmV0d2VlbiAxMDAlIGFuZCAxMTklIG9mIHRoZWlyIHRhcmdldDsgNyB0b3duc2hpcHMgcmVhY2hlZCBiZXR3ZWVuIDgwJSBhbmQgMTAwJSBvZiB0aGVpciB0YXJnZXQ7IGFuZCAyIHRvd25zaGlwcyByZWFjaGVkIGxlc3MgdGhhbiA4MCUgb2YgdGhlaXIgdGFyZ2V0LiAgDQoNCjxicj4NCg0KYGBge3IgaGlzdG9ncmFtLWJlbmVmaWNpYXJpZXMtaHJwLXRhcmdldC1yZWFjaGVkfQ0KDQpwaW4gJT4lICANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgc3RhdGUsIHRvd25zaGlwLCB0YXJnZXRfMjAyMSkgJT4lIA0KICBmaWx0ZXIodGFyZ2V0XzIwMjEgPiAwKSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gYmVuZWZpY2lhcmllcyAvIHRhcmdldF8yMDIxICogMTAwKSAlPiUgIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gaWZlbHNlKHBjX3JlYWNoZWQgPiAyMDAsIDIwMCwgcGNfcmVhY2hlZCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCkpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAyMCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMDAsIGJ5ID0gMjApKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMikpICsgDQogIGxhYnMoeCA9ICIlIG9mIDIwMjEgSFJQIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgdG93bnNoaXBzIiwNCiAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgdG93bnNoaXBzIGJ5IHBlcmNlbnRhZ2Ugb2YgMjAyMSBIUlAgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJWYWx1ZXMgYWJvdmUgMjAwJSBoYXZlIGJlZW4gbHVtcGVkIHRvZ2V0aGVyIGF0IDIwMCUiKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDEuNCBMb2NhdGlvbnMNCg0KUGFydG5lcnMgaGF2ZSByZXNwb25kZWQgaW4gYSB0b3RhbCBvZiBgciBiZW4gJT4lIHNlbGVjdChsb2NhdGlvbikgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgbG9jYXRpb25zIGFjcm9zcyB0aGUgY291bnRyeSwgd2l0aCB0aGUgdmFzdCBtYWpvcml0eSBvZiBsb2NhdGlvbnMgb25seSBoYXZpbmcgb25seSBvbmUgcGFydG5lciBvcGVyYXRpbmcgaW4gdGhlbTsgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRuZXJzIGluIGFueSBsb2NhdGlvbiBpcyAzLiBPZiB0aGUgYHIgZnNjICU+JSBucm93KClgIHJvd3MgcmVwb3J0ZWQgaW4gdGhlIDVXcywgb25seSBgciBzdW0oaXMubmEoZnNjJGxvY2F0aW9uKSlgIGRpZCBub3QgcmVwb3J0IGEgc3BlY2lmaWMgbG9jYXRpb24uDQoNCkxvY2F0aW9ucyBhcmUgY2xhc3NpZmllZCBpbnRvIHRocmVlIGdyb3VwcyAtLSBjYW1wcywgaW5kdXN0cmlhbCB6b25lcyBhbmQgdmlsbGFnZXMvdG93bnMvd2FyZHM6DQoNCmBgYHtyIHRhYmxlLWxvY2F0aW9uc30NCg0KYmVuICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UobG9jYXRpb25zID0gbl9kaXN0aW5jdChsb2NhdGlvbiksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KHRvd25zaGlwKSwNCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHBjX29mX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGF2Z19iZW5fcGVyX2xvYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBsb2NhdGlvbnMsIGRpZ2l0cyA9IDApKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIGxvY2F0aW9uIHR5cGVzIikNCmBgYA0KDQo8YnI+DQoNClRoZSB2YXN0IG1ham9yaXR5IG9mIGxvY2F0aW9ucyBhcmUgc2VydmVkIGJ5IG9ubHkgb25lIHBhcnRuZXIuIEJlbG93IGFyZSBhIHNlcmllcyBvZiBoaXN0b2dyYW1zIHNob3dpbmcgdGhlIHZhcmlhdGlvbiBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYnkgbG9jYXRpb24sIHNwbGl0IGJ5IG51bWJlciBvZiBwYXJ0bmVycyBpbiBlYWNoIGxvY2F0aW9uOg0KDQpgYGB7ciBoaXN0b2dyYW0tbG9jYXRpb25zLWJ5LXBhcnRuZXJ9DQoNCmJlbiAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCB0b3duc2hpcCkgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgYXJyYW5nZShkZXNjKHBhcnRuZXJzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMSkgKw0KICBzY2FsZV94X2xvZzEwKCkgKw0KICBmYWNldF93cmFwKH4gcGFydG5lcnMpICsNCiAgbGFicyh5ID0gIm51bWJlciBvZiBsb2NhdGlvbnMiLA0KICAgICAgIHggPSAiYmVuZWZpY2lhcmllcyBwZXIgbG9jYXRpb24iLCANCiAgICAgICB0aXRsZSA9ICJIaXN0b2dyYW1zIG9mIGJlbmVmaWNpYXJpZXMgYnkgbG9jYXRpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgbnVtYmVyIG9mIHBhcnRuZXJzIHBlciBsb2NhdGlvbiIpDQoNCmBgYA0KDQo8YnI+DQoNClRoZSBtb3JlIHBhcnRuZXJzIG9wZXJhdGluZyBpbiBhIGdpdmVuIGxvY2F0aW9uLCB0aGUgaGlnaGVyIHRoZSBhdmVyYWdlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzOyBob3dldmVyLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGVzZSBtdWx0aS1wYXJ0bmVyIGxvY2F0aW9ucyBhcmUgY29tcGFyYXRpdmVseSByYXJlOg0KDQpgYGB7ciB0YWJsZS1sb2NhdGlvbnMtcGFydG5lcnN9DQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGdyb3VwX2J5KHBhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBzdW0obl9kaXN0aW5jdChsb2NhdGlvbikpLA0KICAgICAgICAgICAgYXZnX2JlbmVmaWNpYXJpZXMgPSBtZWRpYW4oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUocGFydG5lcnMgPSByZWNvZGUocGFydG5lcnMsIGAxYCA9ICJvbmVfcGFydG5lciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAidHdvX3BhcnRuZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJ0aHJlZV9wYXJ0bmVycyIpKSAlPiUgDQogcGFuZGVyKCkNCg0KYGBgDQoNCjxicj48YnI+DQoNCg0KDQojIyAyLiBBY3Rpdml0aWVzIGFuZCBtb2RhbGl0aWVzDQoNCiMjIyAyLjEgUHJvZ3Jlc3MgYnkgYWN0aXZpdHkNCg0KYGBge3IgbGluZS1wbG90LWZhY2V0LWFjdGl2aXR5fQ0KYmVuICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuLCBjb2xvdXIgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiY3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgMjAyMSBRMS1RMyIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkNCg0KYGBgDQoNClBhcnRuZXJzIHJlcG9ydGVkIHRoZWlyIGFjaGlldmVtZW50cyBhY3Jvc3MgdGhlIGVpZ2h0IDVXIGFjdGl2aXRpZXMuIEFzIG5vdGUsIHdlIHNlZSB0aGF0IHRoZSBtYWpvcml0eSBvZiB0aGUgY2FzZWxvYWQgZm9yIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgd2FzIGVzdGFibGlzaGVkIHByaW9yIHRvIDIwMjEgKHdpdGggdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIG9ubHkgaW5jcmVhc2luZyB2ZXJ5IGluY3JlbWVudGFsbHkgYWNyb3NzIHRoZSBjb3Vlc2Ugb2YgdGhlIHllYXIpIC0tIHRoaXMgYWxpZ25zIHdpdGggb3VyIHVuZGVyc3RhbmRpbmcgdGhhdCBtYW55IG9mIHRoZSBwcm9qZWN0cyBjb250cmlidXRpbmcgdG8gdGhpcyBhY3Rpdml0eSB3ZXJlIG11bHRpLXllYXIgaW4gbmF0dXJlIGFuZCBoYWQgYmVlbiBvbmdvaW5nIHByaW9yIHRvIHRoZSBIUlAuIA0KDQpPbmUgb2YgdGhlIGRpZmZpY3VsdGllcyBvZiBpbnRlcnByZXRpbmcgdGhlc2UgZGF0YSBpcyB0aGF0IGl0IGlzIG5vdCBhbHdheXMgYXBwYXJlbnQgd2hlcmUgdGhlIHBhdHRlcm5zIG9ic2VydmVkIGFyZSByZWZsZWN0aXZlIG9yIGNoYW5nZXMgaW4gdGhlIGZpZWxkIChzdWNoIGFzIGNoYW5nZXMgaW4gYWNjZXNzLCBmdW5kaW5nIG9yIHN0YWZmaW5nKSBvciBpZiB0aGV5IGFyZSBpbnN0ZWFkIGR1ZSB0byBwYXJ0bmVycycgcmVwb3J0aW5nIGJlaGF2aW91cnMuIFdlIG5vdGUsIGZvciBpbnN0YW5jZSwgYSBsYXJnZSBqdW1wIGluIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBmb3IgZmlzaGVyeSBpdHMgYW5kIGZvb2QgYmFza2V0cyBhcm91bmQgSnVseSAyMDIxIC0tIHRoaXMgd2FzIGR1ZSB0byB0aGUgbmV3bHktYXBwcm92ZWQgYWRkZW5kdW0gdG8gdGhlIEhSUC4gSG93ZXZlciwgc29tZSBvZiB0aGUgb3RoZXIgY2hhbmdlcyBhcmUgbGVzcyBjbGVhciBhbmQgd2lsbCByZXF1aXJlIGNhcmVmdWwgZXhwbG9yYXRpb24gd2l0aCBwYXJ0bmVycy4gDQoNCjxicj4NCg0KIyMjIDIuMiBEZWxpdmVyeSBtb2RhbGlsdGllcw0KDQpDYXNoIHdhcyB0aGUgbWFpbiBkZWxpdmVyeSBtb2RhbGl0eSBpbiBmb3VyIG91dCBvZiB0aGUgZWlnaHQgYWN0aXZpdGllcyB1bmRlciB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBmb2xsb3dlZCBieSAiaW4ta2luZCIsIHdoaWNoIHdhcyBwcmVkb21pbmFudGx5IGVtcGxveWVkIGluIHRocmVlLiBIb3dldmVyLCB0aGUgaW4ta2luZCBtb2RhbGl0eSBoYXMgdGhlIGhpZ2hlc3QgcmVhY2gsIGdpdmVuIHRoZSBlc3BlY2lhbGx5IGxhcmdlIGJlbmVmaWNpYXJ5IG51bWJlcnMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgZm9vZCBiYXNrZXRzLiBXZSBhbHNvIG5vdGUgc2V2ZXJhbCBtaXNjbGFzc2lmaWNhdGlvbnMgLS0gc21hbGwgcG9ydGlvbnMgb2YgbW9udGhseSBjYXNoIHRyYW5zZmVycyBoYXZlIGJlZW4gY29kZWQgYXMgaW4ta2luZCBhbmQgdGhlcmUgYXJlIGluLWtpbmQgZm9vZCBiYXNrZXRzIGNvZGVkIGFzIGh5YnJpZC4gSXQgbWlnaHQgYWxzbyBiZSB3b3J0aCBtb3JlIGNsZWFybHkgZGVsaW5lYXRpbmcgYmV0d2VlbiAic3VwcG9ydCBmb3IgaW5jb21lLWdlbmVyYXRpbmcgYWN0aXZpdGllcyIgYW5kIHRoZSAicHJvdmlzaW9uIG9mIHRlY2huaWNhbCB0cmFpbmluZyIgYXMgc2VydmljZSBkZWxpdmVyeSBhbmQgc3VwcG9ydCBhcmUgaGVhdmlseSBwcmVzZW50IGluIGJvdGguDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1mYWNldC1hY3Rpdml0eS1tb2RhbGl0eX0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGdyb3VwX2J5KGRlbGl2ZXJ5X21vZGFsaXR5LCBhY3Rpdml0eSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShkZWxpdmVyeV9tb2RhbGl0eSA9IHJlY29kZShkZWxpdmVyeV9tb2RhbGl0eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSHlicmlkIChJbi1raW5kICYgQ2FzaCkiID0gIkh5YnJpZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBkZWxpdmVyeS9zdXBwb3J0IiA9ICJTZXJ2aWNlcy9zdXBwb3J0IikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGVsaXZlcnlfbW9kYWxpdHksIHkgPSBiZW5lZmljaWFyaWVzLCBmaWxsID0gYWN0aXZpdHkpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgdGl0bGUgPSAiRGVsaXZlcnkgbW9kYWxpdHkgYnkgYWN0aXZpdHksIDIwMjEgUTEtUTMiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuNSkpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikNCg0KYGBgDQoNCjxicj4NCg0KYHIgcm91bmQoZmlsdGVyKGZzYywgZGVsaXZlcnlfbW9kYWxpdHkgPT0gIkluLWtpbmQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAvIHN1bShmc2MkYmVuZWZpY2lhcmllcykgKiAxMDApYCUgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVjZWl2ZWQgc3VwcG9ydCB0aHJvdWdoIHRoZSBpbi1raW5kIGRlbGl2ZXJ5IG1vZGFsaXR5OyB3ZSB1c2UgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaGVyZSBhcyB0aGVyZSB3ZXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mIG1vZGFsaXRpZXMgY2hhbmdpbmcgcGFydHdheSB0aHJvdWdoIGFuIGludGVydmVudGlvbjogZm9yIHJlZmVyZW5jZSwgYHIgcm91bmQoZmlsdGVyKGZzYywgZGVsaXZlcnlfbW9kYWxpdHkgPT0gIkluLWtpbmQiKSAlPiUge3N1bSguJHVfYmVuKX0gLyBzdW0oZnNjJHVfYmVuKSAqIDEwMClgJSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbml0aWFsbHkgd2l0aCBpbi1raW5kIGludGVydmVudGlvbnMsIG1lYW5pbmcgdGhhdCB0aGVyZSB3YXMgYSB0ZW5kZW5jeSB0byBkaXZlcnNpZnkgYXdheSBmcm9tIGluLWtpbmQgc3VwcG9ydCBvdmVyIDIwMjEuIGByIHJvdW5kKGZpbHRlcihmc2MsIGRlbGl2ZXJ5X21vZGFsaXR5ID09ICJDYXNoIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJGJlbmVmaWNpYXJpZXMpICogMTAwKWAlIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHdlcmUgcmVhY2hlZCBieSBjYXNoIHRyYW5zZmVycy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1tb2RhbGl0eS1mcmVxdWVuY3l9DQojIGNoYW5nZWQgdG8gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaW5zdGVhZCBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyANCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRlbGl2ZXJ5X21vZGFsaXR5LCBmcmVxdWVuY3kpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmcmVxdWVuY3ksIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhZG9ybl90b3RhbHMoImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfVG90YWwgPSByb3VuZChUb3RhbCAvIHN1bShUb3RhbCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgYnkgZGVsaXZlcnkgbW9kYWxpdGllcyBhbmQgZnJlcXVlbmN5IG9mIGRpc3RyaWJ1dGlvbiIpDQoNCmBgYA0KDQo8YnI+DQoNClJlZ2FyZGluZyB0aGUgdGFibGUgYWJvdmUsIHRoZXJlIGlzIGEgc3Ryb25nIGFyZ3VtZW50IHRvIHJlbW92ZSB0aGUgb3B0aW9uICJvdGhlciIgZnJvbSB0aGUgNVcgY29sdW1uIGBmcmVxdWVuY3lgIChyZWZlcnJpbmcgdG8gZnJlcXVlbmN5IG9mIHRyYW5zZmVyL2RlbGl2ZXJ5KSAtLSB3aGF0IGV4YWN0bHkgaXQgY29ubm90ZXMgaXMgdW5jbGVhciwgYXMgcGFydG5lcnMgbWlnaHQgZWxlY3QgdGhpcyBvcHRpb24gZm9yIGFjdGl2aXRpZXMgdGhhdCBvY2N1ciBib3RoIG1vcmUgYW5kIGxlc3MgZnJlcXVlbnRseSB0aGFuIGV2ZXJ5IG1vbnRoOyB0aGVyZSBpcyBhbHNvIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHBhcnRuZXJzIGFyZSBqdXN0IGVsZWN0aW5nICJvdGhlciIgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBjb2x1bW4gYmxhbmsuIEl0IGlzIHBvc3NpYmxlIHRvIGJhY2tmaWxsIHNvbWUgb2YgdGhlICJvdGhlciIgdmFsdWVzIGZyb20gdGhlIGBiZW5lZmljaWFyeV9yZWN1cnJlbmN5YCBjb2x1bW4uIFRoaXMgd2lsbCBiZSBleHBsb3JlZCBmdXJ0aGVyIGluIHRoZSBjaGFwdGVyIG9uIGJlbmVmaWNpYXJpZXMuICANCg0KQSBrZXkgcGllY2Ugb2YgbWlzc2luZyBpbmZvcm1hdGlvbiBub3QgY3VycmVudGx5IGNhcHR1cmVkIGJ5IHRoZSA1VyB0ZW1wbGF0ZSBpcyB0aGUgZHVyYXRpb24gb2YgdGhlc2UgYWN0aXZpdGllcyAtLSB0aGUgbnVtYmVyIG9mIG1vbnRocyBhIG1vbnRobHkgZm9vZCBiYXNrZXQgaXMgcHJvdmlkZWQgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBzb21ld2hhdCByZWxpYWJseSB3aXRoIGNvbnNpZGVyYWJsZSBlZmZvcnQuIFRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgYXZlcmFnZSBkdXJhdGlvbiAoaW4gbW9udGhzKSBvZiB0aGUgdmFyaW91cyBhY3Rpdml0aWVzIGluIHRoZSBgZnJlcXVlbmN5YCBjYXRlZ29yeSAiTW9udGhseSI6DQoNCmBgYHtyIHRhYmxlLWF2Zy1kdXJhdGlvbi1hY3Rpdml0aWVzfQ0KZnNjICU+JSAgDQogIGZpbHRlcihmcmVxdWVuY3kgPT0gIk1vbnRobHkiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB0b3duc2hpcCwgbG9jYXRpb24pICU+JQ0KICBzdW1tYXJpc2UocmVjdXJyZW5jZXMgPSBuX2Rpc3RpbmN0KGRhdGUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19kdXJhdGlvbl9tb250aHMgPSBtZWFuKHJlY3VycmVuY2VzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYXZnX2R1cmF0aW9uX21vbnRocykpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQXZlcmFnZSBkdXJhdGlvbiAoaW4gbW9udGhzKSBvZiBtb250aGx5IGFjdGl2aXRpZXMiKQ0KICANCmBgYA0KDQo8YnI+DQoNCiMjIyAyLjMgTW9uZXRhcnkgdmFsdWVzIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBwZXIgaG91c2Vob2xkDQoNCjxicj4NCg0KYGBge3IgcGxvdC11c2QtaGhkLWJpbn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmICFpcy5uYSh1c2RfaGhkX2JpbikpICU+JQ0KICBncm91cF9ieSh1c2RfaGhkX2JpbikgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUoYCVfb2ZfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHVzZF9oaGRfYmluLCB5ID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBgJV9vZl9iZW5lZmljaWFyaWVzYCksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgMTYwMDAwLCBieSA9IDIwMDAwKSkgKw0KICBsYWJzKHggPSAiVVNEIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIsDQogICAgICAgeSA9ICIlIG9mIGJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIGJ5IHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIpDQpgYGANCg0KPGJyPg0KDQpUaGUgbW9zdCBjb21tb24gdHJhbnNmZXIgdmFsdWVzIC0tIGluIHRlcm1zIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCAtLSBhcmUgYmV0d2VlbiBVU0QgMTAgYW5kIFVTRCAyMCwgdGhvdWdoIGl0IHNob3VsZCBiZSBub3RlZCAtLSBhbmQgY2FuIGJlIG1vcmUgY2xlYXJseSBzZWVuIGZyb20gdGhlIHRhYmxlIGJlbG93LCBhIG5vdCBpbnNpZ25pZmljYW50IG51bWJlciBvZiBiZW5lZmljaWFyaWVzIChhYm91dCA4JSkgd2VyZSByZWFjaGVkIGJ5IGNhc2ggdHJhbnNmZXIgaW50ZXJ2ZW50aW9ucyB2YWx1ZWQgYXQgbW9yZSB0aGFuIFVTRCAxMDAgcGVyIGhvdXNlaG9sZC4gUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBtb25ldGFyeSB2YWx1ZXMgd2VyZSBjYWxjdWxhdGVkIG9ubHkgZnJvbSByb3dzIHdpdGggdW5pcXVlIGJlbmVmaWNpYXJpZXMgc28gdGhhdCB3ZSBhcmUgbm90IHVzaW5nIHRoZSBjdW11bGF0aXZlIHN1bXMgcGVyIGhvdXNlaG9sZC4gDQoNCmBgYHtyIHRhYmxlLXVzZC1oaGQtYmluLWZyZXF1ZW5jeX0NCiMgcmVtaW5kZXIgdG8gcmVkbyB0aGUgdmFsdWVzIGluIHRoZSBwYXJhZ2FwaCBhYm92ZSBpZiB5b3UgcmVydW4gdGhpcyBvbiBuZXcgZGF0YSANCg0KZnNjICU+JSAgDQogIGZpbHRlcighaXMubmEodXNkX2hoZF9iaW4pICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ2FzaCIsICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIsICJWb3VjaGVyIikpICU+JSANCiAgY291bnQodXNkX2hoZF9iaW4sZnJlcXVlbmN5LCB3dCA9IGJlbmVmaWNpYXJpZXMpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZnJlcXVlbmN5LCB2YWx1ZXNfZnJvbSA9IG4pICU+JSANCiAgcmVuYW1lKHRyYW5zZmVyX3ZhbHVlID0gdXNkX2hoZF9iaW4pICU+JQ0KICByZWxvY2F0ZShGaXJzdCwgLmFmdGVyID0gdHJhbnNmZXJfdmFsdWUpICU+JSANCiAgc2VsZWN0KC1gTkFgKSAlPiUgDQogIGFkb3JuX3RvdGFscygiY29sIiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShwY19vZl9Ub3RhbCA9IHJvdW5kKFRvdGFsIC8gc3VtKFRvdGFsKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiQ2FzaCB0cmFuc2ZlciwgaHlicmlkIGFuZCB2b3VjaGVyIHZhbHVlcyBwZXIgaG91c2Vob2xkIGJ5IGZyZXF1ZW5jeSBvZiB0cmFuc2ZlciAoVVNEKSIpICAgDQpgYGANCg0KPGJyPg0KDQpOZXh0LCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgaG91c2Vob2xkIHBhY2thZ2UgdmFsdWVzIGJ5IGFjdGl2aXR5IHR5cGU6DQoNCmBgYHtyIGJhcnBsb3QtZmFjZXQtdXNkLWhoZC1iaW4tYWN0aXZpdHl9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVzZF9oaGRfYmluKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB1c2RfaGhkX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICBsYWJzKHRpdGxlID0gIlZhcmlhdGlvbiBpbiB0aGUgIHBlciBob3VzZWhvbGQgdmFsdWVzIG9mIGludGVydmVudGlvbiBwYWNrYWdlcyBpbiBVU0QiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IGFjdGl2aXR5IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHksIHNjYWxlcyA9ICJmcmVlX3kiKQ0KDQpgYGANCg0KDQpPdmVyYWxsLCB0aGUgaGlnaGVzdCBhdmVyYWdlIGNhc2ggdHJhbnNmZXJzIHdlcmUgZnJvbSBhY3Rpdml0aWVzIHByb3ZpZGluZyBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiBhbmQgdGhlIGxvd2VzdCBhdmVyYWdlcyBjb21pbmcgZnJvbSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIChhZnRlciBkaXNjb3VudGluZyBmb29kIGJhc2tldHMsIHdoZXJlIGxlc3MgdGhhbiAxJSBvZiBhY3Rpdml0aWVzIHJlcG9ydGVkIHRoZSBwYWNrYWdlIHZhbHVlKS4gDQoNCkl0IHdvdWxkIGJlIGZydWl0ZnVsIHRvIGV4cGxvcmUgdGhlIHByb3Zpc2lvbiBvZiBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIGluIG1vcmUgZGV0YWlsIC0tIHRoaXMgYWN0aXZpdHkgaGFzIGEgdmVyeSBjbGVhciBwZWFrIGF0IGA+PSQxMF88JDIwYC4gQSBjbG9zZXIgbG9vayByZXZlYWxzIHRoYXQgdGhpcyBpcyBhbG1vc3QgZW50aXJlbHkgZHVlIHRvIHRoZSBgciBmc2MgJT4lIGZpbHRlcih2YWx1ZV9wZXJfaG91c2Vob2xkX3VzZCA9PSAxMC41ICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBiZW5lZmljaWFyaWVzIHdobyByZWNlaXZlZCBtb250aGx5IHRyYW5zZmVycyBvZiBVU0QgMTAuNTAvbW9udGggKG9yIE1NSyAxNSwwMDApIHBlciBob3VzZWhvbGQuIEl0IGlzIHVuY2xlYXIgd2hldGhlciB0aGlzIGlzIGEgZGF0YSBlbnRyeSBlcnJvciAtLSBidXQgd2hhdCB3ZSBkbyBrbm93IGlzIHRoYXQgdGhlIGhvdXNlaG9sZHMgdGhhdCByZWNlaXZlZCB0aGlzIHR5cGUgb2YgdHJhbnNmZXIgd2VyZSBub3QgYWJub3JtYWxseSBzbWFsbDsgaXQgbWlnaHQgYmUgcG9zc2libGUgdGhhdCBiZSBwb3NzaWJsZSB0aGF0IHRoaXMgYWN0aXZpdHkgaGFkIGJlZW4gY29uY2VpdmVkIGFzIG9uZSBzaW5ndWxhciB0cmFuc2ZlciB0aGF0IGhhZCBiZWVuIHNwbGl0IGFjcm9zcyBzZXZlcmFsIG1vbnRocy4gDQoNClRoaXMgc2hvdWxkIGJlIGZvbGxvd2VkIHVwIHdpdGggdGhlIDcgcGFydG5lcnMgd2hvIHByb3ZpZGVkIHRoaXMgdHJhbnNmZXIgdmFsdWUgdG8gYmVuZWZpY2lhcnkgaG91c2Vob2xkczsgdGhleSBhcmU6IFNhdmUgdGhlIENoaWxkcmVuLCBXRlAsIE15YW5tYXIgSGVhcnQgT3JnYW5pc2F0aW9uLCBQZW9wbGUgZm9yIFBlb3BsZSwgUGxhbiBJbnRlcm5hdGlvbmFsLCBXb3JsZCBWaXNpb24gTXlhbm1hciBhbmQgS2FydW5hIE1pc3Npb24gU29jaWFsIFNvbGlkYXJpdHkuIA0KDQpJZiBjb3JyZWN0LCB0aGlzIGFtb3VudCBmYWxscyBmYXIgYmVsb3cgdGhlIG1pbmltdW0gZXhwZW5kaXR1cmUgYmFza2V0IGZvciBmb29kIGlkZW50aWZpZWQgYnkgdGhlIENhc2ggV29ya2luZyBHcm91cCwgd2hpY2ggZXN0YWJsaXNoZWQgYSBmbG9vciBvZiBNTUsgMTkwLDU1NSBwZXIgaG91c2Vob2xkIHBlciBtb250aC4gQmVsb3cgaXMgYSB0YWJsZSB3aGljaCBzdW1tYXJpc2VzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBtaW5pbXVtIGV4cGVuZGl0dXJlIGJhc2tldCBpcyBjb3ZlcmVkIGJ5IHRoZSBkaWZmZXJlbnQgYmlucyB3ZSBoYXZlIGVzdGFibGlzaGVkIGZvciB0aGUgY2FzaC10cmFuc2ZlciB2YWx1ZXM6DQoNCmBgYHtyIHRhYmxlLW1lYi11c2QtaGhkLWJpbn0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmIGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiKSAlPiUgDQogIGZpbHRlcighaXMubmEodmFsdWVfcGVyX2hvdXNlaG9sZCkpICU+JSANCiAgbXV0YXRlKHBjX21lYiA9IHZhbHVlX3Blcl9ob3VzZWhvbGQgLyAxOTA1NTUpICU+JSANCiAgZ3JvdXBfYnkodXNkX2hoZF9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGF2Z19wY19vZl9tZWIgPSByb3VuZChtZWFuKHBjX21lYikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYXZnX3VzZF9tb250aCA9IHJvdW5kKG1lYW4odmFsdWVfcGVyX2hvdXNlaG9sZF91c2QsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiTW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVyIGJ5IHBlcmNlbnRhZ2Ugb2YgTUVCIHJlY2VpdmVkIikNCg0KIyByZW1pbmRlciB0byByZWRvIHZhbHVlcyB3aGVuIHlvdSByZXJ1biB0aGlzIHdpdGggbmV3IGRhdGEgDQogIA0KYGBgDQoNCkFyb3VuZCA5JSBvZiBiZW5lZmljaWFyaWVzIG9mIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgaGF2ZSByZWNlaXZlZCBtb3JlIHRoYW4gNTAlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXQgZm9yIGZvb2QuIE5vdGFibHksIDE1JSBvZiBiZW5lZmljaWFyaWVzIGhhdmUgcmVjZWl2ZWQgbGVzcyB0aGFuIFVTRCAxMCBwZXIgaG91c2Vob2xkIHBlciBtb250aC4gVGhpcyB1bmRlcnNjb3JlcyB0aGUgaW1wb3J0YW5jZSBvZiBzdGFuZGFyZGlzYXRpb246IGJlbmVmaWNpYXJpZXMgaGF2ZSBhbHJlYWR5IHJlY2VpdmVkIHZlcnkgZGlmZmVyZW50IHBhY2thZ2UgYW1vdW50cyBhbmQgdGhlcmUgaXMgYSBwcmVzc2luZyBuZWVkIHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gb24gd2hldGhlciBjYXNoIHRyYW5zZmVycyAoYW5kIGZvb2QgYmFza2V0cykgaGF2ZSBiZWVuIGRlc2lnbmVkIHRvIGJlIGZ1bGwgcmF0aW9ucyBvciBhcmUgaW5zdGVhZCBpbnRlbmRlZCB0byBiZSBzdXBwbGVtZW50YXJ5IGFjdGl2aXRpZXMuIFRoaXMgaXMga2V5IGZyb20gYSBjb29yZGluYXRpb24gc3RhbmRwb2ludCBhcyB3ZSBjYW5ub3QgY29uc2lkZXIgdGhlIGZvb2Qgc2VjdXJpdHkgbmVlZHMgb2YgdGhvc2Ugd2hvIGhhdmUgb25seSByZWNlaXZlZCBzdXBwbGVtZW50YXJ5IHRyYW5zZmVycyB0byBoYXZlIGJlZW4gY292ZXJlZC4NCg0KDQo8YnI+PGJyPg0KDQojIyAzLiBQYXJ0bmVycw0KDQpPZiB0aGUgNTEgcGFydG5lcnMgb2YgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgYSB0b3RhbCBvZiBgciBmc2MgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIG9mIHRoZW0gY2xhc3NpZmllZCB0aGVtc2VsdmVzIGFzIGltcGxlbWVudGluZyBwYXJ0bmVycyB3aXRoaW4gdGhlIDVXcy4gVGhleSBhcmUgZmFpcmx5IGV2ZW5seSBzcGxpdCB0aGVtc2VsdmVzIGJldHdlZW4gSFJQIGluZGljYXRvcnMsIHdpdGggYHIgZnNjICU+JSBmaWx0ZXIoc3RyX2RldGVjdChocnBfaW5kaWNhdG9yLCAiMS4iKSkgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGNvbnRyaWJ1dGluZyB0b3dhcmRzIGZvb2QgYW5kIGNhc2ggYXNzaXN0YW5jZSBhbmQgYHIgZnNjICU+JSBmaWx0ZXIoc3RyX2RldGVjdChocnBfaW5kaWNhdG9yLCAiMi4iKSkgJT4lIHNlbGVjdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIGNvbnRyaWJ1dGluZyB0b3dhcmRzIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQuIGByIGJlbiAlPiUgc3VtX2JlbihpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBmaWx0ZXIoYmVuZWZpY2lhcmllcyA8IDEwMDAwKSAlPiUgbnJvdygpYCBwYXJ0bmVycyBoYXZlIHJlYWNoZWQgbGVzcyB0aGFuIDEwLDAwMCB1bmlxdWUgYmVuZWZpY2lhcmllcyBhbmQgdGhlIG1lZGlhbiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHBhcnRuZXJzIGlzIGByIGJlbiAlPiUgc3VtX2JlbihpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSB7bWVkaWFuKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYC4gQmVsb3cgYXJlIHRoZSB0b3AgMTAgcGFydG5lcnMgYnkgSFJQIGluZGljYXRvci4gQXMgYSBzaWRlIG5vdGUsIFppZ3dheSBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBhIHZlbmRvci9zdXBwbGllciBvZiBXRlAsIGFuZCBub3QgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVyIC0tIHNvbWUgZm9sbG93IHVwIHdpdGggV0ZQIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHJlY3RpZnkgdGhpcy4NCg0KYGBge3IgdGFibGUtdG9wLXBhcnRuZXJzLWJ5LWhycC1pbmRpY2F0b3J9DQoNCiMgcmVtaW5kZXIgdG8gcmVkbyB0aGUgbnVtYmVycyB3aGVuIHlvdSByZXJ1biB0aGlzIHdpdGggZnJlc2ggZGF0YSANCg0KY2JpbmQoDQogIA0KICBiZW4gJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2UiKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICByZW5hbWUoYDEuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZWAgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICBgUGFydG5lcnMgSFJQIGluZGljYXRvcjFgID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgaGVhZCgxMCksDQogIA0KICBiZW4gJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0IikgJT4lIA0KICAgIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgcmVuYW1lKGAyLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBhZ3JpY3VsdHVyZSBhbmQgb3RoZXIgbGl2ZWxpaG9vZCBzdXBwb3J0YCA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgIGBQYXJ0bmVycyBIUlAgaW5kaWNhdG9yMmAgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBoZWFkKDEwKQ0KICANCikgJT4lIA0KICBhZGRfY29sdW1uKGAgYCA9ICIgIikgJT4lIA0KICByZWxvY2F0ZShgIGAsIC5hZnRlciA9IGAxLiBOdW1iZXIgb2YgcGVvcGxlIHdobyByZWNlaXZlZCBmb29kIGFuZC9vciBjYXNoIGFzc2lzdGFuY2VgKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIGJ5IEhSUCBpbmRpY2F0b3IiKQ0KDQpgYGANCg0KPGJyPg0KDQojIyMgMy4xIERpc3RyaWJ1dGlvbiBvZiBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIGFuZCBnZW9ncmFwaGljIHJlYWNoDQoNCldoaWxzdCB0aGVyZSBpcyBxdWl0ZSBhIGJpdCBvZiB2YXJpYXRpb24gaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQsIHdlIGNhbiBzZWUgdGhhdCBwYXJ0bmVycycgZ2VvZ3JhcGhpYyBmb290cHJpbnRzIGFyZSAtLSBvbiB0aGUgd2hvbGUgLS0gcXVpdGUgbGltaXRlZC4gT25seSBgciBiZW4gJT4lIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIHN1bW1hcmlzZSh0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSBmaWx0ZXIodG93bnNoaXBzID4gMTApICU+JSBucm93KClgIHBhcnRuZXJzIGhhdmUgYSBwcmVzZW5jZSBpbiBtb3JlIHRoYW4gMTAgdG93bnNoaXBzLCB3aXRoIG9ubHkgYHIgYmVuICU+JSBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIGJlaW5nIHByZXNlbnQgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiA3OSUgb2Ygb3VyIHBhcnRuZXJzIChjbHVzdGVyZWQgYWxvbmcgdGhlIGJvdHRvbSBvZiB0aGUgY2hhcnQpIGFyZSBwcmVzZW50IGluIDUgb3IgbGVzcyB0b3duc2hpcHMuIFRoaXMgZGlzdHJpYnV0aW9uIG9mIHBhcnRuZXJzIGlzIGFuIGltcGVkaW1lbnQgdG8gYSBjb3VudHJ5d2lkZSByZXNwb25zZSBhbmQgaXQgaXMgaW1wZXJhdGl2ZSB0byB1bmRlcnN0YW5kIGhvdyBiZXN0IHRvIGluY2VudGl2aXNlIHBhcnRuZXJzIHRvIGV4cGFuZCB0aGVpciBmb290cHJpbnRzLg0KDQpgYGB7ciBwbG90bHktc2NhdHRlci1wYXJ0bmVycy1yZWFjaH0NCiMgcmVtaW5kZXIgdG8gcmVjYWxjdWxhdGUgdGhlIDc5JSBhYm92ZSBpZiB5b3UgcmVydW4gdGhlIGRhdGEgDQpwYXJ0bmVyX3NjYXR0ZXIgPC0gYmVuICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZShzdGF0ZXMgPSBuX2Rpc3RpbmN0KGFkbWluMV9wY29kZSksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhzdGF0ZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSB0b3duc2hpcHMsIHRleHQgPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSArICANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2ciLCBsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gYygwLCAxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDMwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAzMCwgNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgDQojIGZvciBzb21lIHJlYXNvbiwgcmVtb3ZpbmcgdGhpcyBtZXNzZXMgd2l0aCB0aGUgYWxpZ25tZW50IG9mIHRoZSBwbG90DQoNCmdncGxvdGx5KHBhcnRuZXJfc2NhdHRlcikgJT4lDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zdXA+IikpKQ0KICANCmBgYA0KDQo8YnI+DQoNCiMjIyAzLjIgTWFwIG9mIG51bWJlciBvZiBwYXJ0bmVycyBhbmQgMjAyMiBwZW9wbGUgaW4gbmVlZCBieSBzdGF0ZS9yZWdpb24NCg0KDQpgYGB7ciBoYXMtcGFydG5lci1kYXRhc2V0fQ0KaGFzX3BhcnRuZXIgPC0gcGluICU+JSBzZWxlY3Qoc3RhdGUsIGFkbWluM19wY29kZSwgdG93bnNoaXAsIHBpbl8yMDIyKSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lICANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIG11dGF0ZShoYXNfcGFydG5lciA9IGlmZWxzZShwYXJ0bmVycyA9PSAwLCBGQUxTRSwgVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoaGFzX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKHBpbl8yMDIyID0gc3VtKHBpbl8yMDIyKSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG4oKSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcygiY29sIikgJT4lIA0KICBtdXRhdGUocGluXzIwMjIgPSByb3VuZChwaW5fMjAyMiAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICB0b3duc2hpcHMgPSByb3VuZCh0b3duc2hpcHMgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KDQpgYGANCg0KRm9vZCBTZWN1cml0eSBDbHVzdGVyIHBhcnRuZXJzIGFyZSBub3Qgd2VsbC1wb3NpdGlvbmVkIHRvIG1lZXQgdGhlIG5lZWRzIG9mIHRoZSAyMDIyIHBvcHVsYXRpb24gaW4gbmVlZC4gUGFydG5lcnMgYXJlIGxhcmdlbHkgY29uY2VudHJhdGVkIGluIEthY2hpbiwgUmFraGluZSBhbmQgWWFuZ29uLCB3aXRoIG5vIHBhcnRuZXJzIHByZXNlbnQgaW4gVGFuaW50aGFyeWkgYW5kIEJhZ28gKFdlc3QpIGFuZCBvbmx5IG9uZSBwYXJ0bmVyIHByZXNlbnQgaW4gTWFnd2F5LCBCYWdvIChFYXN0KSBhbmQgU2hhbiAoRWFzdCkuIFRoZSBudW1iZXIgb2YgcGFydG5lcnMgaW4gQXllcnlhd2FkeSBpcyBhbHNvIHF1aXRlIGRpc3Byb3BvcnRpb25hdGUgd2l0aCB0aGUgbnVtYmVyIG9mIHBlb3BsZSBpbiBuZWVkIGluIHRoYXQgcmVnaW9uLiANCg0KT3ZlcmFsbCwgYHIgcm91bmQoaGFzX3BhcnRuZXIgJT4lIGZpbHRlcihoYXNfcGFydG5lciA9PSBGQUxTRSkgJT4lIHB1bGwodG93bnNoaXBzKSlgJSBvZiB0b3duc2hpcHMsIGNvbnRhaW5pbmcgYHIgcm91bmQoaGFzX3BhcnRuZXIgJT4lIGZpbHRlcihoYXNfcGFydG5lciA9PSBGQUxTRSkgJT4lIHB1bGwocGluXzIwMjIpKWAlIG9mIHRoZSAyMDIyIFBJTiwgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQuIFRoaXMgbGFjayBvZiBuYXRpb253aWRlIGNvdmVyYWdlIHdpbGwgYmUgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBjb25zdHJhaW50cyB0aGF0IHRoZSBGU0Mgd2lsbCBmYWNlIGluIG1lZXRpbmcgdGhlIDIwMjIgbmVlZHMgb2YgdnVsbmVyYWJsZSwgZm9vZCBpbnNlY3VyZSBwZXJzb25zIGFuZCBJRFBzIC0tIGFuZCByZXNvbHZpbmcgdGhpcyB3aWxsIG5lY2Vzc2l0YXRlIGluY3JlYXNpbmcgcGFydG5lciBjb3ZlcmFnZSBhbmQgZmluZGluZyBuZXcgcGFydG5lcnMgdGhlIGNsdXN0ZXIuDQoNCmBgYHtyIG1hcC1wYXJ0bmVycy1waW4tdG93bnNoaXAsIGZpZy5oZWlnaHQ9MTB9DQojIHBsYXkgd2l0aCBnZW9tX2xpbmUgZm9yIHRoZSBpbnRlcmFjdGl2ZSByZWZlcmVuY2UgbWFwIC0tIG1heWJlIHlvdSBjYW4gZ2V0IHRoZSBvdXRsaW5lcyB0byBiZSBpbiBkaWZmZXJlbnQgY29sb3Vycw0KDQpiZW4gJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBwYXJ0bmVycyksIHNpemUgPSAwLjEpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudCh0cmFucyA9ICJyZXZlcnNlIiwgYnJlYWtzID0gYygxLCAzLCA1LCA3LCA5KSkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSkgKw0KICBsYWJzKHRpdGxlID0gIk1hcCBvZiBudW1iZXIgb2YgcGFydG5lcnMgYnkgdG93bnNoaXAiKSArDQoNCnBpbiAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoUElOID0gc3VtKHBpbl8yMDIyKSkgJT4lIA0KICBtdXRhdGUoUElOID0gcm91bmQoUElOLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICBQSU4gPSByZWNvZGUoUElOLCANCiAgICAgICAgICAgICAgICAgICAgICAnMCcgPSBOQV9yZWFsXykpICU+JQ0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gUElOKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gInJldmVyc2UiLCBicmVha3MgPSBjKDEwMDAwLCA1MDAwMCwgMTAwMDAwLCAxNTAwMDAsIDE4MDAwMCkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSkgKw0KICBsYWJzKHRpdGxlID0gIk1hcCBvZiAyMDIyIFBJTiBieSB0b3duc2hpcCIpDQoNCmBgYA0KDQoNCg0KIyMjIDMuMyBSZXBvcnRpbmcgb3JnYW5pc2F0aW9ucw0KDQpUaGVyZSBhcmUgYHIgZnNjICU+JSBkaXN0aW5jdChyZXBvcnRpbmdfb3JnYW5pemF0aW9uLCBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSBucm93KClgIGNvbWJpbmF0aW9ucyBiZXR3ZWVuIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zIGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lcnMsIGByIGZzYyAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gPT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgbnJvdygpYCBvZiB3aGljaCBhcmUgaW5zdGFuY2VzIHdoZXJlIHRoZSByZXBvcnRpbmcgb3JnYW5pc2F0aW9uIGFuZCB0aGUgaW1wbGVtZW50aW5nIHBhcnRuZXIgYXJlIHRoZSBzYW1lIG9yZ2FuaXNhdGlvbjsgb25jZSB0aGVzZSBhcmUgZmlsdGVyZWQgb3V0LCBhbGwgdGhlIHJlbWFpbmluZyBpbXBsZW1lbnRpbmcgcGFydG5lcnMgY29ycmVzcG9uZCB0byBqdXN0IGByIGZzYyAlPiUgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gIT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIG5yb3coKWAgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnM6DQoNCmBgYHtyIHRhYmxlLXJlcG9ydGluZy1vcmdhbmlzYXRpb259DQpmc2MgJT4lIA0KICBmaWx0ZXIocmVwb3J0aW5nX29yZ2FuaXphdGlvbiAhPSBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgZ3JvdXBfYnkocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gJ051bWJlciBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbicpDQogIA0KYGBgDQoNClJlZ2FyZGluZyBxdWVzdGlvbnMgb2YgbWVtYmVyc2hpcCwgaXQgd291bGQgYmUgc2FmZSB0byBzYXkgdGhhdCBhbGwgcGFydG5lcnMgd2hvIHJlcG9ydGVkIGluIHRoZSA1V3MgLS0gYmUgdGhleSByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucyBvciBpbXBsZW1lbnRpbmcgcGFydG5lcnMgLS0gaW4gYWRkaXRpb24gdG8gc3RyYXRlZ2ljIHBhcnRuZXJzIGFuZCBwYXJ0bmVycyB3aG8gYWlkIGluIGFuYWx5c2lzIHdobyBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoZSA1V3MsIGFyZSBGU0MgcGFydG5lcnMuIEhvd2V2ZXIsIGZvciB0aGlzIHJlcG9ydCwgd2UgaGF2ZSB1c2VkIGBpbXBsZW1lbnRpbmdfcGFydG5lcnNgIGZvciBtb3N0IG9mIHRoZSBhbmFseXNpcyBhcywgYnkgdGhlaXIgbmF0dXJlLCByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucyBkbyBub3QgaGF2ZSBhIGZpZWxkIHByZXNlbmNlLiBBcyBhIHNpZGUgbm90ZSwgRkFPIGhhcyBub3QgY2xhc3NpZmllZCBpdHNlbGYgYXMgYW4gaW1wbGVtZW50aW5nIHBhcnRuZXIsIGhhdmluZyByZXBvcnRlZCBubyBhY3Rpdml0aWVzIHRoYXQgd2VyZSBkaXJlY3RseSBpbXBsZW1lbnRlZCBieSB0aGVtLiANCg0KPGJyPg0KDQojIyMgMy40IFR5cGVzIG9mIHBhcnRuZXJzDQoNCmBgYHtyIHRhYmxlLWltcGxlbWVudGluZy1wYXJ0bmVyLXR5cGV9DQpmc2MgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlLCBpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSwNCiAgICAgICAgICAgIHN0YXRlcyA9IG5fZGlzdGluY3QoYWRtaW4xX3Bjb2RlKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShhdmdfYmVuZWZpY2lhcmllcyA9IG1lYW4oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICBhdmdfdG93bnNoaXBzID0gbWVhbih0b3duc2hpcHMpLCANCiAgICAgICAgICAgIGF2Z19zdGF0ZXMgPSBtZWFuKHN0YXRlcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAgDQogIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgcmVhY2ggYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSIpDQpgYGANCg0KVGhlcmUgaXMgbm8gcmVhbCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGF2ZXJhZ2UgbnVtYmVycyBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgSU5HT3MgYW5kIE5OR09zOyBob3dldmVyLCB0aGUgZ2VvZ3JhcGhpY2FsIHJlYWNoIG9mIElOR09zIGlzIG1hcmtlZGx5IGdyZWF0ZXIsIHBlcmhhcHMgZHVlIHRvIHRoZSBtdWNoIHRpZ2h0ZXIgZ2VvZ3JhcGhpY2FsIGZvY3VzIG9mIHNldmVyYWwgY29tbXVuaXR5LWJhc2VkIG9yZ2FuaXNhdGlvbnMuIFRoZXJlIGlzIG9ubHkgb25lIGFnZW5jeSBpbiB0aGUgIlVOIiBjYXRlZ29yeSBmb3IgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSAtLSBXRlAuDQoNClRoZSBvbmx5IG5vdGFibGUgdGhpbmcgYWJvdXQgdGhlIGBkb25vcmAgY29sdW1uIGlzIGl0cyBpbmNvbXBsZXRlbmVzcywgd2hpY2ggaXMgdW5kZXJzdGFuZGFibGUgLS0gb25seSBgciByb3VuZChzdW0oKCFpcy5uYShmc2MkZG9ub3IpKSkgLyBucm93KGZzYykgKiAxMDAsIGRpZ2l0cyA9IDApYCUgKHJlcHJlc2VudGluZyBvbmx5IDEwJSBvZiBhbGwgcmVwb3J0ZWQgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMpIG9mIHRoZSByb3dzIGFyZSBmaWxsZWQuIEFkZGl0aW9uYWxseSwgd2UgYWxzbyBvYnNlcnZlIGEgbnVtYmVyIG9mIGVycm9ycywgaW5jbHVkaW5nIGNhc2VzIHdoZXJlIG11bHRpcGxlIGRvbm9ycyBoYXZlIGJlZW4gY29tYmluZWQgaW50byBvbmUgcm93IGFzIHdlbGwgYXMgbnVtZXJvdXMgaW5zdGFuY2VzIHdoZXJlIFdGUCwgRkFPIGFuZCBVTiBXT01FTiB3ZXJlIGNsYXNzaWZpZWQgYXMgZG9ub3JzIGFzIG9wcG9zZWQgdG8gcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMuIE5vdCBtdWNoIHVzZWZ1bCBhbmFseXNpcyBjYW4gYmUgZXh0cmFjdGVkIGZyb20gdGhpcyBjb2x1bW4gYXQgcHJlc2VudC4NCg0KPGJyPjxicj4NCg0KIyMgNC4gQmVuZWZpY2lhcmllcw0KDQojIyMgNC4xIEJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9ucw0KDQpDdXJyZW50bHksIGluIHRoZSA1V3MsIHRoZSB2YXN0IG1ham9yaXR5IG9mIGJlbmVmaWNpYXJ5IGRpYXNhZ2dyZWdhdGlvbnMgaGF2ZSBiZWVuIGJhY2tmaWxsZWQgZnJvbSBjZW5zdXMgZGF0YSBhbmQgZG8gbm90LCBjb25zZXF1ZW50bHksIHByb3ZpZGUgYW4gYWNjdXJhdGUgcGljdHVyZSBvZiB0aGUgcG9wdWxhdGlvbiB0aGF0IGhhdmUgYmVlbiByZWFjaGVkIGJ1IEZvb2QgU2VjdXJpdHkgaW50ZXJ2ZW50aW9ucy4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgZmFyIHJlYWxpdHkgZGl2ZXJnZXMgZnJvbSB3aGF0IGhhcyBiZWVuIHJlcG9ydGVkIHNvIGZhciAtLSBtZWFuaW5nIHRoYXQgd2UgYWxzbyBjYW5ub3QgZGV0ZXJtaW5lIGlmIHRoZXJlIGhhcyBiZWVuIGFueSBiaWFzIGluIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBhbmQgdGFyZ2V0dGluZy4gSXQgaXMgaW1wZXJhdGl2ZSB0byBiZWdpbiBjb2xsZWN0aW5nIGRpc2FnZ3JlZ2F0ZWQgYmVuZWZpY2lhcnkgZGF0YSBmcm9tIHBhcnRuZXJzLiANCg0KSXQgaXMgZW50aXJlbHkgcG9zc2libGUgdGhhdCBwYXJ0bmVycyBhcmUgY29sbGVjdGluZyB0aGlzIGRhdGEgLS0gZGlzYWdncmVnYXRlZCBiZW5lZmljaWFyeSBkYXRhIGlzIG9uZSBvZiB0aGUgbW9zdCBjb21tb24gZGF0YSByZXF1aXJlZCBmb3IgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcG9ydGluZyAtLSBhbmQgdGhhdCBpdCBpcyBtZXJlbHkgbmVjZXNzYXJ5IHRvIHdvcmsgd2l0aCBwYXJ0bmVycyB0byB3cmFuZ2xlIHRoZWlyIGRhdGEgaW50byB0aGUgNVcgZm9ybWF0LiBIb3dldmVyLCB0aGUgY2FwYWNpdGllcyBvZiBwYXJ0bmVycyB0byBkaXNhZ2dyZWdhdGUgYmVuZWZpY2lhcnkgZGF0YSBzaG91bGQgYmUgaW52ZXN0aWdhdGVkIGJ5IHRoZSBjbHVzdGVyIGFuZCBpcyBhbiBpbXBvcnRhbnQgaXNzdWVzIHRoYXQgc2hvdWxkIGJlIGJyb3VnaHQgdXAgaW4gdGUgbmV4dCBwbGVuYXJ5IHNlc3Npb24uIA0KDQo8YnI+DQoNCiMjIyA0LjIgVHlwZXMgb2YgYmVuZWZpY2lhcmllcw0KDQpgYGB7ciBiZW5lZmljaWFyeS10eXBlLWRhdGFzZXR9DQpiZW5fdHlwZSA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGFkb3JuX3BlcmNlbnRhZ2VzKGRlbm9taW5hdG9yID0gImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KYGBgDQoNCg0KVGhlIHN0YXRlcyBhbmQgc3ViLXJlZ2lvbnMgaW4gd2hpY2ggd2UgYXJlIHdvcmtpbmcgdGhlIG1vc3Qgd2l0aCBJRFBzIGFyZSBCYWdvIChFYXN0KSwgS2FjaGluLCBDaGluLCBTaGFuIChOb3J0aCkgYW5kIEtheWFoLiBPdmVyYWxsLCBgciBiZW5fdHlwZSAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcylgJSBvZiBiZW5lZmljaWFyaWVzIGFyZSBmcm9tIHRoZSBob3N0L2xvY2FsIGNvbW11bml0eSwgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJSYWtoaW5lIHN0YXRlbGVzcyIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgYXJlIHN0YXRlbGVzcyBwZXJzb25zIGZyb20gUmFraGluZSBhbmQgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJJbnRlcm5hbGx5IERpc3BsYWNlZCIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgYXJlIElEUHMuIFJldHVybmVlcyBhcmUgdGhlIHJhcmVzdCB0eXBlIG9mIGJlbmVmaWNpYXJ5IHJlYWNoZWQsIGZvcm1pbmcgb25seSBgciBiZW5fdHlwZSAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIlJldHVybmVlcyIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gRWFjaCByb3cgaW4gdGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBwZXJjZW50YWdlIG9mIGVhY2ggYmVuZWZpY2lhcnkgdHlwZSB3aXRoaW4gZWFjaCBzdGF0ZS9yZWdpb24uIA0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyeS10eXBlcy1zdGF0ZX0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lICANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGJlbmVmaWNpYXJ5X3R5cGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhZG9ybl90b3RhbHMod2hlcmUgPSAicm93IiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKGRlbm9taW5hdG9yID0gInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhgSG9zdC9sb2NhbCBDb21tdW5pdHlgLCBgSW50ZXJuYWxseSBEaXNwbGFjZWRgLCBgUmV0dXJuZWVzYCwgYFJha2hpbmUgc3RhdGVsZXNzYCksIA0KICAgICAgICAgICAgLmZ1bnMgPSBsaXN0KH4gcm91bmQoLiAqIDEwMCwgZGlnaXRzID0gMikpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChgSG9zdC9sb2NhbCBDb21tdW5pdHlgID0gMCwgYEludGVybmFsbHkgRGlzcGxhY2VkYCA9IDAsIGBSZXR1cm5lZXNgID0gMCwgYFJha2hpbmUgc3RhdGVsZXNzYCA9IDApKSAlPiUgIA0KICBsZWZ0X2pvaW4oZnNjICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShiZW5lZmljaWFyeV90eXBlKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoc3RhdGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSksIGJ5ID0gInN0YXRlIikgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJ5IHR5cGVzIGJ5IHN0YXRlL3JlZ2lvbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQoNCmBgYA0KDQo8YnI+DQoNCkNvbXBhcmVkIHRvIG9ubHkgdGhlIDIwMjEgSFJQIHRhcmdldHMgKGFzIHRoZSBJRVJQIGRvZXMgbm90IGhhdmUgYnJlYWtkb3ducyBvZiB0aGUgdGFyZ2V0IGJ5IGJlbmVmaWNpYXJ5IHR5cGUpLCB3ZSBjYW4gc2VlIHRoYXQgd2hpbHN0IHRhcmdldHMgaGF2ZSBiZWVuIG1vc3RseSBleGNlZWRlZCwgbmVpdGhlciB0aGUgdGFyZ2V0cyBmb3IgcmV0dXJuZWVzL3Jlc2V0dGxlZCBpbiBLYWNoaW4gb3IgU2hhbiAoTm9ydGgpIG5vciB0YXJnZXRzIGZvciBJRFBzIGluIFJha2hpbmUgb3IgS2F5aW4gaGF2ZSBiZWVuIG1ldC4gSW50ZXJlc3RpbmdseSwgZm9yIFJha2hpbmUsIHRoZSB0YXJnZXRzIGZvciB0aGUgaG9zdC9sb2NhbCBwb3B1bGF0aW9uIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkLiBJbiBCYWdvIChFYXN0KSwgQ2hpbiwgYW5kIHBhcnRpY3VsYXJseSBTaGFuIChOb3J0aCksIHRoZSB0YXJnZXRzIGZvciBJRFBzIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkLCBpbiBjb21wYXJpc29uIHRvIHRoZSAyMDIxIEhSUCB0YXJnZXRzOg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyeS10eXBlLXJlYWNoZWQtaHJwLXRhcmdldH0NCiMgcmVtaW5kZXIgdG8gY2hlY2sgdGhlIHRleHQgaW4gdGhlIHBhcmFncmFwaCBhYm92ZSB3aGVuIHlvdSByZXJ1biB0aGUgcmVwb3J0IHdpdGggZGF0YQ0KcGluICU+JQ0KICBmaWx0ZXIoaHJwX3RhcmdldF90b3RhbCA+IDApICU+JSANCiAgc2VsZWN0KHN0YXRlLCBhZG1pbjNfcGNvZGUsIGhycF90YXJnZXRfaWRwc18yMDIxLCBocnBfdGFyZ2V0X3JldHVybmVlc18yMDIxLCBocnBfdGFyZ2V0X3N0YXRlbGVzc19yYWtoaW5lXzIwMjEsIA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEsIGhycF90YXJnZXRfdG90YWwpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlLCBiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGJlbmVmaWNpYXJ5X3R5cGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUodG90YWxfYmVuZWZpY2lhcmllcyA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhocnBfdGFyZ2V0X2lkcHNfMjAyMTp0b3RhbF9iZW5lZmljaWFyaWVzKSwgfnN1bSguKSkgJT4lIA0KICBtdXRhdGUoaG9zdF9sb2NhbF9wYyA9IGhvc3RfbG9jYWxfY29tbXVuaXR5IC8gaHJwX3RhcmdldF9vdGhlcl92dWxuZXJhYmxlXzIwMjEgKiAxMDAsIA0KICAgICAgICAgaWRwX3BjID0gaW50ZXJuYWxseV9kaXNwbGFjZWQgLyBocnBfdGFyZ2V0X2lkcHNfMjAyMSAqIDEwMCwNCiAgICAgICAgIHJldHVybmVlc19wYyA9IHJldHVybmVlcyAvIGhycF90YXJnZXRfcmV0dXJuZWVzXzIwMjEgKiAxMDAsDQogICAgICAgICByYWtoaW5lX3N0YXRlbGVzc19wYyA9IHJha2hpbmVfc3RhdGVsZXNzIC8gaHJwX3RhcmdldF9zdGF0ZWxlc3NfcmFraGluZV8yMDIxICogMTAwLA0KICAgICAgICAgdG90YWxfcGMgPSB0b3RhbF9iZW5lZmljaWFyaWVzIC8gaHJwX3RhcmdldF90b3RhbCAqIDEwMCkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIGhvc3RfbG9jYWxfcGMsIGlkcF9wYywgcmV0dXJuZWVzX3BjLCByYWtoaW5lX3N0YXRlbGVzc19wYywgdG90YWxfcGMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhob3N0X2xvY2FsX3BjLCBpZHBfcGMsIHJldHVybmVlc19wYywgcmFraGluZV9zdGF0ZWxlc3NfcGMsIHRvdGFsX3BjKSwgfiByZXBsYWNlKC4sIGlzLm5hbiguKSwgTkEpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcmVwbGFjZSguLCBpcy5pbmZpbml0ZSguKSwgTkEpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYyksIH4gcm91bmQoLiwgZGlnaXRzID0gMikpICU+JQ0KICByZW5hbWUoYGhvc3RfbG9jYWwlYCA9IGhvc3RfbG9jYWxfcGMsDQogICAgICAgICBgaWRwJWAgPSBpZHBfcGMsDQogICAgICAgICBgcmV0dXJuZWVzJWAgPSByZXR1cm5lZXNfcGMsDQogICAgICAgICBgcmFraGluZV9zdGF0ZWxlc3MlYCA9IHJha2hpbmVfc3RhdGVsZXNzX3BjLA0KICAgICAgICAgYHRvdGFsJWAgPSB0b3RhbF9wYykgJT4lIA0KICBwYW5kZXIoY2FwdGlvbiA9ICJQZXJjZW50YWdlIG9mIDIwMjEgSFJQIHRhcmdldCByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUiKQ0KDQogIA0KYGBgDQogDQo8YnI+DQoNClN0YXRlbGVzcyBwZXJzb25zIGZyb20gUmFraGluZSBoYXZlIHRoZSBsYXJnZXN0IGF2ZXJhZ2UgaG91c2Vob2xkIHNpemVzLCBhbmQgdGhlIGxhcmdlc3QgdmFyaWF0aW9ucyBpbiBob3VzZWhvbGQgc2l6ZS4gVGhlIHRoaWNrIGJhciBpbiB0aGUgbWlkZGxlIG9mIGVhY2ggYm94IHNob3dzIHRoZSBhdmVyYWdlIGhvdXNlaG9sZCBzaXplIGZvciBlYWNoIGJlbmVmaWNpYXJ5IHR5cGUgLS0gdGhpcyB2YWx1ZSBpcyBhbHNvIHNob3duIGluIHRoZSB0ZXh0IGxhYmVsIGJlbG93IHRoZSBsaW5lLiBUaGUgbG93ZXIgYW5kIHVwcGVyIGJvcmRlcnMgb2YgZWFjaCBib3ggaW5kaWNhdGUgdGhlIHZhbHVlcyBmb3IgdGhlIDI1dGggYW5kIDc1dGggcGVyY2VudGlsZXMgcmVzcGVjdGl2ZWx5LiBGb3IgaW5zdGFuY2UsIHdlIGNhbiBzZWUgdGhhdCBob3VzZWhvbGRzIGF0IHRoZSAyNXRoIHBlcmNlbnRpbGUgb2YgaG91c2Vob2xkcyBpbiBob3N0L2xvY2FsIGNvbW11bml0aWVzIGhhdmUgb25seSBvbmUgbWVtYmVyIGFuZCBob3VzZWhvbGRzIHRoYXQgaGF2ZSBhcm91bmQgNSBtZW1iZXJzIGhhdmUgbW9yZSBtZW1iZXJzIHRoYW4gNzUlIG9mIGFsbCB0aGUgaG91c2Vob2xkcyBpbiB0aGF0IGdyb3VwLiBPdXRsaWVycyBhcmUgbWFya2VkIGJ5IGRvdHMuIFdlIG5vdGUgYSBsb3Qgb2YgcG90ZW50aWFsIGRhdGEgZW50cnkgZXJyb3JzIHdoZXJlIGxlc3MgdGhhbiBvbmUgcGVyc29uIHBlciBob3VzZWhvbGQgaGF2ZSBiZWVuIHJlY29yZGVkLiANCg0KPGJyPg0KDQpgYGB7ciBib3hwbG90LWhvdXNlaG9sZC1zaXplLWJlbmVmaWNpYXJ5LXR5cGV9DQoNCiMgdGhpcyBpcyBmb3IgdGhlIGxhYmVscyBmb3IgdGhlIGJveHBsb3QNCmhoZF9sYWJzIDwtIGZzYyAlPiUgIA0KICBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSAhPSAiTkEiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShhdmdfaGhkX3NpemUgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gaG91c2Vob2xkcywgZGlnaXRzID0gMikpICANCiANCg0KIyBmb3Igc29tZSByZWFzb24sIHRoZSBtdXRhdGUgZmN0X3Jlb3JkZXIgaXMgbm90IHdvcmtpbmcNCiMgeW91IGZpZ3VyZWQgdGhpcyBvdXQgYnV0IGhhdmUgbmVnbGVjdGVkIHRvIHdyaXRlIHRoZSBhbnN3ZXIgaGVyZSANCiANCmZzYyAlPiUgDQogIGZpbHRlcihiZW5lZmljaWFyeV90eXBlICE9ICJOQSIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBtdXRhdGUoYXZnX2hoZF9zaXplID0gYmVuZWZpY2lhcmllcyAvIGhvdXNlaG9sZHMsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmY3RfcmVvcmRlcihiZW5lZmljaWFyeV90eXBlLCBhdmdfaGhkX3NpemUpLCB5ID0gYXZnX2hoZF9zaXplKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZW9tX3RleHQoZGF0YSA9IGhoZF9sYWJzLCBhZXMobGFiZWwgPSBhdmdfaGhkX3NpemUpLCBzaXplID0gMi41KSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTQsIDIpLCBsaW1pdHMgPSBjKDAsMTQpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkF2ZXJhZ2UgaG91c2Vob2xkIHNpemUiLA0KICAgICAgIHRpdGxlID0gIkF2ZXJhZ2UgaG91c2Vob2xkIHNpemUgYnkgYmVuZWZpY2lhcnkgdHlwZXMiKQ0KDQpgYGANCg0KDQo8YnI+DQoNCiMjIyA0LjMgQmVuZWZpY2lhcmllcyBieSBhY3Rpdml0eSBmcmVxdWVuY3kNCg0KVGhlIGNhdGVnb3JpZXMgIkZpcnN0IiBhbmQgIk1vbnRobHkiIGluIHRoZSBmcmVxdWVuY3kgY29sdW1uIGRvIG5vdCBzZWVtIHRvIGJlIGZpbGxlZCBhcyBpbnRlbmRlZCwgYXMgY2FuIGJlIHNlZW4gZnJvbSB0aGUgcGxvdCBiZWxvdzoNCg0KPGJyPg0KDQpgYGB7ciBsaW5lLXBsb3QtZmlyc3QtbW9udGhseX0NCg0KZnNjICU+JSANCiAgZmlsdGVyKGZyZXF1ZW5jeSA9PSAiRmlyc3QiIHwgZnJlcXVlbmN5ID09ICJNb250aGx5IikgJT4lIA0KICBncm91cF9ieShkYXRlLCBmcmVxdWVuY3kpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGJlbmVmaWNpYXJpZXMsIGNvbG91ciA9IGZyZXF1ZW5jeSkpICsgDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJCZW5lZmljaWFyaWVzIiwNCiAgICAgICB0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgZnJlcXVlbmN5IC0tIGNvbXBhcmlzb24gYmV0d2VlbiAnRmlyc3QnIGFuZCAnTW9udGhseSciKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkNCg0KYGBgDQoNClRoZSBhc3N1bXB0aW9uIGZvciB0aGVzZSBjYXRlZ29yaWVzIGlzIHRoYXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGEgYmVuZWZpY2lhcnkgcmVjZWl2aW5nIHN1cHBvcnQgKGFzIHBhcnQgb2YgYSBjb250aW51aW5nIG1vbnRobHkgc3VwcG9ydCBwYWNrYWdlKSB3b3VsZCBmYWxsIHVuZGVyIHRoZSBjYXRlZ29yeSAiRmlyc3QiIGFuZCBldmVyeSBzdWJzZXF1ZW50IHRpbWUgdGhleSByZWNlaXZlZCBzdXBwb3J0LCBpdCB3b3VsZCBiZSB1bmRlciAiTW9udGhseSIuIA0KDQpCdXQgd2UgY2FuIHNlZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBjYXNlIC0tIG1vbnRobHkgYmVuZWZpY2lhcmllcyBwcmVkYXRlZCB0aGUgdXNlIG9mIHRoZSAiRmlyc3QiIGNhdGVnb3J5IGJ5IGF0IGxlYXN0IGZvdXIgbW9udGhzOyBmdXJ0aGVybW9yZSwgdGhlIHNwaWtlIGluIGZpcnN0LXRpbWUgYmVuZWZpY2lhcmllcyBpbiBNYXkgMjAyMSB3YXMgbm90IGFjY29tcGFuaWVkIGJ5IGFueSBpbmNyZWFzZSBpbiBtb250aGx5IGJlbmVmaWNpYXJpZXMgaW4gdGhlIHN1YnNlcXVlbnQgbW9udGhzIC0tIGluIGZhY3QsIHRoZXJlIHdhcyBhIGRlY2xpbmUgaW4gbW9udGhseSBiZW5lZmljaWFyaWVzLiBDb21wbGljYXRpbmcgYWxsIHRoaXMgaXMgdGhhdCB3ZSBhcmUgbm90IHN1cmUgd2hpY2ggb2YgdGhlIGJlbmVmaWNpYXJpZXMgdHJhY2sgYmVuZWZpY2lhcmllcyBpbiBhIGNvbXByZWhlbnNpdmUgbWFubmVyIGkuZS4gd2l0aCBhIGJlbmVmaWNpYXJ5IGRhdGFiYXNlIGFuZCBiZW5lZmljaWFyeSBJRCBjYXJkcy4gQWxsIHRoaXMgaW5kaWNhdGVzIHRoYXQgLS0gYWZ0ZXIgY29uZmlybWluZyB0aGlzIHdpdGggcGFydG5lcnMgLS0gd2Ugc2hvdWxkIGFiYW5kb24gdGhlICJGaXJzdCIgY2F0ZWdvcnkgYW5kIHJlY29kZSB0aGVzZSBlbnRyaWVzIGFzICJPbmUtb2ZmIi4NCg0KDQo8YnI+DQoNCiMjIyA0LjQgR2FwcyBpbiBtb250aGx5IHByb2dyYW1taW5nDQoNCmBgYHtyIHRhYmxlLWdhcHMtbW9udGhzfQ0KIyBJIGZlZWwgbGlrZSB0aGlzIGlzIHRoZSBtb3N0IGluZWZmaWNpZW50IHdheSB0byBkbyB0aGlzOyBzdGlsbCB3b3JrcywgdGhvdWdoIA0KZ2FwX21vbnRocyA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoZnJlcXVlbmN5ID09ICJNb250aGx5IiAmIGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIGdyb3VwX2J5KGRhdGUsIGltcGxlbWVudGluZ19wYXJ0bmVycywgYWN0aXZpdHksIHN0YXRlLCB0b3duc2hpcCwgbG9jYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGRhdGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICB1bm5lc3QoKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShyZWN1cnJlbmNlcyA9IHJvd1N1bXMoIWlzLm5hKHNlbGVjdCguLCAtaW1wbGVtZW50aW5nX3BhcnRuZXJzLCAtYWN0aXZpdHksIC1zdGF0ZSwgLXRvd25zaGlwLCAtbG9jYXRpb24pKSksDQogICAgICAgICBiZW5fbWF4ID0gcG1heChgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCksIG5hbWVzX3RvID0gImRhdGUiLCB2YWx1ZXNfdG8gPSAiYmVuZWZpY2lhcmllcyIpICU+JSANCiAgbXV0YXRlKGRpc3RyaWJ1dGlvbiA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgIm4iLCAieSIpKSAlPiUgDQogIHNlbGVjdCgtYmVuZWZpY2lhcmllcykgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGF0ZSwgdmFsdWVzX2Zyb20gPSBkaXN0cmlidXRpb24pICU+JSANCiAgbXV0YXRlKGdhcHMgPSBwYXN0ZTAoYDIwMjEtMDEtMDFgLCBgMjAyMS0wMi0wMWAsIGAyMDIxLTAzLTAxYCwgYDIwMjEtMDQtMDFgLCBgMjAyMS0wNS0wMWAsIGAyMDIxLTA2LTAxYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyMDIxLTA3LTAxYCwgYDIwMjEtMDgtMDFgLCBgMjAyMS0wOS0wMWApKSAlPiUgDQogIG11dGF0ZShnYXBfbW9udGhzID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubm55IikgfiA2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm55IikgfiA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubnkiKSB+IDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm55IikgfiAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bm55IikgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGdhcHMsICJ5bnkiKSB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgDQoNCiMjIGNvbW1lbnRlZCBvdXQsIGJ1dCB0aGlzIHdhcyBqdXN0IHRvIGdldCB0aGUgbnVtYmVyIG9mIHRvd25zaGlwcyB3aXRoIGdhcHMgcGVyIHN0YXRlDQojIGdhcF9tb250aHMgJT4lIA0KIyAgIGZpbHRlcihyZWN1cnJlbmNlcyA+IDEpICU+JSANCiMgICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXApICU+JSANCiMgICBzdW1tYXJpc2UoYXZnX2dhcCA9IG1lYW4oZ2FwX21vbnRocyksIA0KIyAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbl9tYXgpKSAlPiUgDQojICAgYXJyYW5nZShkZXNjKGF2Z19nYXApKSAlPiUNCiMgICBmaWx0ZXIoYXZnX2dhcCA+IDApICU+JSANCiMgICBncm91cF9ieShzdGF0ZSkgJT4lDQojICAgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QodG93bnNoaXApKQ0KDQpnYXBfbW9udGhzICU+JSANCiAgZmlsdGVyKHJlY3VycmVuY2VzID4gMSkgJT4lIA0KICBncm91cF9ieShnYXBfbW9udGhzKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QodG93bnNoaXApLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcGFuZGVyKGNhcHRpb24gPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYW5kIGxvY2F0aW9ucyBieSBkdXJhdGlvbiBvZiBnYXBzIGluIGltcGxlbWVudGF0aW9uIikNCg0KIyByZW1pbmRlciB0byBjaGVjayB0aGUgcGFyYWdyYXBoIGJlbG93IHdoZW4geW91IHJlcnVuIHRoZSByZXBvcnQNCg0KYGBgDQoNCjc1JSBvZiBiZW5lZmljaWFyaWVzIGV4cGVyaWVuY2VkIG5vIGdhcHMgaW4gbW9udGhseSBwcm9ncmFtbWluZyBhbmQgdmVyeSBsb25nIGdhcHMgb2YgNCBvciA1IG1vbnRocyBhcmUgcXVpdGUgcmFyZTsgb2YgdGhlIGJlbmVmaWNpYXJpZXMgd2hvIGRpZCBleHBlcmllbmNlIGdhcHMgaW4gbW9udGhseSBjb3ZlcmFnZSwgbW9zdCBleHBlcmllbmNlZCBnYXBzIG9mIDEtMiBtb250aHMuIFRoZSAxMCB0b3duc2hpcHMgd2hpY2ggZXhwZXJpZW5jZWQgdGhlIGxvbmdlc3QgYXZlcmFnZSBnYXBzIGJldHdlZW4gIm1vbnRobHkiIGFjdGl2aXRpZXMgd2VyZTogTW9obnlpbiwgTXlpdGt5aW5hLCBIcGFrYW50LCBNb2dhdW5nLCBDaGlwd2kgYW5kIFdhaW5nbWF3IGluIEthY2hpbjsgU2h3ZXB5aXRoYXIgaW4gWWFuZ29uOyBEZW1vc28gYW5kIExvaWthdyBpbiBLYXlhaDsgYW5kIEt1dGthaSBpbiBTaGFuLiBPdmVyYWxsLCAxMiB0b3duc2hpcHMgaW4gS2FjaGluIGV4cGVyaWVuY2VkIGdhcHMgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIG1vbnRobHkgYWN0aXZpdGllczsgNiBpbiBSYWtoaW5lOyAyIGVhY2ggaW4gQXlleWFyd2FkeSwgS2F5YWggYW5kIFNoYW47IGFuZCAxIGluIFlhbmdvbi4gSXQgc2hvdWxkIGJlIGV4cGxvcmVkIHdoZXRoZXIgdGhlIGRlbGF5cyBpbiB0aGVzZSBhcmVhcyB3ZXJlIGR1ZSB0byBhY2Nlc3MgaXNzdWVzIG9yIG90aGVyIG90aGVyIGNvbnN0cmFpbnRzLiANCg0KVGhlcmUgYXJlIDE2NyBlbnRyaWVzIGNvZGVkIGFzIGJlaW5nIGltcGxlbWVudGVkIG9uIGEgbW9udGhseSBiYXNpcyB0aGF0IGhhdmUgbm90IHJlY3VycmVkIC0tIHRoYXQgaXMsIHRoZXkgaGF2ZSBvbmx5IGJlZW4gaW1wbGVtZW50ZWQgb25jZTogd2Ugc2hvdWxkIGNoZWNrIHdpdGggcGFydG5lcnMgaWYgdGhlc2UgYXJlIG1lcmVseSB0aGUgZmlyc3QgaW5zdGFuY2VzIG9yIGlmIHRoZXkgYXJlIGVycm9ycyBpbiBkYXRhIGVudHJ5IG9yIGlmIHRoZXJlIGhhdmUgYmVlbiBpc3N1ZXMgd2l0aCBhY2Nlc3MsIHNlY3VyaXR5IG9yIGZ1bmRpbmcuIA0KDQo8YnI+DQoNCiMjIyA0LjUgUG90ZW50aWFsIGZvciBwb3N0LWRpc3RyaWJ1dGlvbiBtb25pdG9yaW5nDQoNClRoZSB0YWJsZSBiZWxvdyBzaG93cyBhY3Rpdml0aWVzIHdoaWNoIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBmb3IgNiBtb250aHMgb3IgbW9yZSwgdGhlIG51bWJlciBvZiBsb2NhdGlvbnMgdGhleSB3ZXJlIGltcGxlbWVudGVkIGluIGFuZCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgYWN0aXZpdGllcyBtZWV0aW5nIHRoZXNlIGNyaXRlcmlhLiBUaGUgcG9zc2liaWxpdHkgb2Ygam9pbnQgbW9uaXRvcmluZyAtLSBvciBhdCBsZWFzdCB0aGUgam9pbnQgcmV2aWV3IGFuZCBhbmFseXNpcyBvZiBtb25pdG9yaW5nIGRhdGEgLS0gd2lsbCBiZSBleHBsb3JlZCwgaW4gY29uc3VsdGF0aW9uIHdpdGggdGhlc2UgcGFydG5lcnMuIFRoZSByYXRpb25hbGUgYmVpbmcgdGhhdCA2IG1vbnRocyBvZiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgYSBsb25nIGVub3VnaCBwZXJpb2Qgb2YgdGltZSB0byBtYWtlIGltcGFjdCBtb25pdG9yaW5nIGZlYXNpYmxlOyBhZGRpdGlvbmFsbHksIGpvaW50IG1vbml0b3Jpbmcgd2lsbCBiZSBmdXJ0aGVyIGZhY2lsaXRhdGVkIGJ5IHRoZSBzaW1pbGFyaXR5IG9mIHRoZXNlIGFjdGl2aXRpZXMsIGFsbW9zdCBhbGwgb2Ygd2hpY2ggYXJlIHJlY3VycmVudCBjYXNoIHRyYW5zZmVycyBvciBkaXN0cmlidXRpb25zIG9mIGZvb2QgYmFza2V0cy4gDQoNCg0KYGBge3IgdGFibGUtbW9udGhseS1hY3Rpdml0aWVzLTYtOS1tb250aHMsIHdhcm5pbmc9RkFMU0V9DQoNCmZzYyAlPiUgDQogIGZpbHRlcihmcmVxdWVuY3kgPT0gIk1vbnRobHkiICYgYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgc2VsZWN0KGRhdGUsIGltcGxlbWVudGluZ19wYXJ0bmVycywgYWN0aXZpdHksIHRvd25zaGlwLCBsb2NhdGlvbiwgYmVuZWZpY2lhcmllcykgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGF0ZSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIHVubmVzdCgpICU+JSANCiAgbXV0YXRlKHJlY3VycmVuY2VzID0gcm93U3VtcyghaXMubmEoc2VsZWN0KC4sIC1pbXBsZW1lbnRpbmdfcGFydG5lcnMsIC1hY3Rpdml0eSwgLXRvd25zaGlwLCAtbG9jYXRpb24pKSksDQogICAgICAgICBiZW5lZmljaWFyaWVzID0gcG1heChgMjAyMS0wMS0wMWAsIGAyMDIxLTAyLTAxYCwgYDIwMjEtMDMtMDFgLCBgMjAyMS0wNC0wMWAsIGAyMDIxLTA1LTAxYCwgYDIwMjEtMDYtMDFgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIwMjEtMDctMDFgLCBgMjAyMS0wOC0wMWAsIGAyMDIxLTA5LTAxYCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIocmVjdXJyZW5jZXMgPiA1KSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgIGxvY2F0aW9ucyA9IG4oKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHBhbmRlcihjYXB0aW9uID0gIk51bWJlciBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyB3aGljaCBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IDYgbW9udGhzIG9mIHJlY3VycmVudCBmb29kIHNlY3VyaXR5IHN1cHBvcnQiKQ0KDQpgYGANCg0KDQoNClRoZSBwYXJ0bmVycyB3aGljaCBoYXZlIGltcGxlbWVudGVkIGFjdGl2aXRpZXMgZml0dGluZyB0aGVzZSBjcml0ZXJpYSBhcmUgV0ZQLCBLYXJ1bmEgTWlzc2lvbiBTb2NpYWwgU29saWRhcml0eSwgV29ybGQgVmlzaW9uIE15YW5tYXIsIE15YW5tYXIgT3BlbiBIZWFydCBEZXZlbG9wbWVudCBPcmdhbmlzYXRpb24sIFBlb3BsZSBmb3IgUGVvcGxlIGFuZCBQbGFuIEludGVybmF0aW9uYWwgZm9yIG1vbnRobHkgY2FzaCB0cmFuc2ZlcnM7IFdvcmxkIFZpc2lvbiBNeWFubWFyLCBNeWFubWFyIE9wZW4gSGVhcnQgRGV2ZWxvcG1lbnQgT3JnYW5pc2F0aW9uLCBBY3Rpb24gZm9yIEdyZWVuIEVhcnRoLCBQZW9wbGUgSG9wZSBDb21tdW5pdHkgRGV2ZWxvcG1lbnQgKFBIQ0QpLCBUb2dldGhlciBmb3IgU3VzdGFpbmFibGUgRGV2ZWxvcG1lbnQsIEthcnVuYSBNaXNzaW9uIFNvY2lhbCBTb2xpZGFyaXR5IGFuZCBXRlAgZm9yIG1vbnRobHkgZm9vZCBiYXNrZXRzOyBhbmQgdGhlIERhLU51IE5hdGlvbmFsIEFmZmFpcnMgT3JnYW5pc2F0aW9uIChETkFPKSBmb3IgdGVjaG5pY2FsIHRyYWluaW5nLiANCg0KDQoNCjxicj48YnI+DQoNCiMjIDUuIE5leHQgc3RlcHMNCg0KMS4gIENvbW11bmljYXRlIHRvIHBhcnRuZXJzIHRoYXQgWWFuZ29uIGlzIHNldmVyZWx5IG92ZXJzdWJzY3JpYmVkIGluIGNvbXBhcmlzb24gdG8gdGhlIHJlc3Qgb2YgdGhlIGNvdW50cnksIGFib3ZlIGFsbCBpbiB0aGUgdG93bnNoaXBzIG9mIEhsYWluZ3RoYXJ5YSwgRGFnb24gTXlvdGhpdCAoU2Vpa2thbiksIGFuZCBEYWxhLg0KDQoyLiAgQ29sbGVjdCBleGlzdGluZyBpbnRlcnZlbnRpb24gcGFja2FnZXMgZnJvbSBwYXJ0bmVycyBpbiBvcmRlciB0byBiZWdpbiB0aGUgcHJvY2VzcyBvZiBzdGFuZGFyZGlzYXRpb24gYW5kIHRvIHN1cHBvcnQgdGhlIHJldmlldyBvZiBmb29kIGJhc2tldHMgZm9yIHRoZWlyIGNhbG9yaWMgYW5kIG51dHJpdGlvbmFsIHZhbHVlLiBQZXJmb3JtIGFkZGl0aW9uYWwgYW5hbHlzaXMgdG8gdW5kZXJzdGFuZCBpZiBiZW5lZmljaWFyaWVzIGluIGNsb3NlIHByb3hpbWl0eSB0byBlYWNoIG90aGVyIGhhdmUgcmVjZWl2ZWQgd2lkZWx5IGRpdmVyZ2VudCBwYWNrYWdlIHZhbHVlcy4gQWRkaXRpb25hbGx5LCBzcGVhayB3aXRoIHBhcnRuZXJzIHRvIHVuZGVyc3RhbmQgd2h5IGNhc2ggdHJhbnNmZXIgdmFsdWVzIHZhcnkgYnkgc28gbXVjaCBldmVuIHdpdGhpbiB0aGUgc2FtZSBhY3Rpdml0eSBpbXBsZW1lbnRlZCBieSB0aGUgc2FtZSBwYXJ0bmVyLiANCg0KMy4gUmV2aXNpdCBhcmVhcyB3aGljaCBoYXZlIG9ubHkgcmVjZWl2ZWQgc21hbGxlciBzdXBwbGVtZW50YXJ5IHRyYW5zZmVycyAtLSBhIHRyYW5zZmVyIG9mIGFyb3VuZCBVU0QgMTAgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGggY2Fubm90IGJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBjb3ZlcmVkIHRoZSBmb29kIHNlY3VyaXR5IG5lZWRzIGZvciB0aGF0IGFyZWEgLS0gb3RoZXIgcGFydG5lcnMgbWF5IGJlIG5lY2Vzc2FyeSB0byBjb3ZlciB0aGUgZ2FwLiANCg0KNC4gQWR2b2NhdGUgZm9yIHRoZSBleHBhbnNpb24gb2YgcGFydG5lcnMnIGdlb2dyYXBoaWMgZm9vdHByaW50cyB0byByZWFjaCB0aGUgcmVtYWluaW5nIDIxMyB0b3duc2hpcHMgd2hpY2ggaGF2ZSB5ZXQgdG8gYmVuZWZpdCBmcm9tIGFueSBGU0MgYWN0aXZpdGllcy4gVGhlIGVmZmVjdHMgb2YgdGhlIGN1cnJlbnQgY3Jpc2lzIGluIE15YW5tYXIgaGF2ZSBub3QgYmVlbiBkZXRlcm1pbmVkIGJ5IGFuIGVwaWNlbnRyZSBvciBhIHN0b3JtcGF0aCBhbmQgdGhlcmUgaXMgbm8gcHJvZ3JhbW1hdGljIHJhdGlvbmFsZSBmb3IgdGhlIHJlc3BvbnNlIHRvIGJlIHNvIHVuZXZlbi4gVGhpcyBhZHZvY2FjeSBzaG91bGQgYmUgdGFyZ2V0dGVkIGF0IHRoZSBJQ0NHLCBDbHVzdGVyIHBhcnRuZXJzLCBvdGhlciBDbHVzdGVycyBhbmQgYXQgZG9ub3JzLiANCg0KNS4gQ29sbGVjdCA1VyBkYXRhIGZyb20gb3RoZXIgY2x1c3RlcnMgc28gdGhhdCBtdWx0aS1zZWN0b3IgY292ZXJhZ2UgbWF5IGJlIHJldmlld2VkLiBDbGVhbiBhbmQgcHJvY2VzcyBjb25mbGljdCBkYXRhIHNvIHRoYXQgaXQgbWF5IGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCBwYXJ0bmVycycgY292ZXJhZ2UuIA0KDQo2LiBXb3JrIHdpdGggcGFydG5lcnMgdG8gZGV0ZXJtaW5lIHRoZWlyIGN1cnJlbnQgY2FwYWNpdGllcyB0byBzdWJtaXQgYWdlIGFuZCBzZXgtZGlzYWdncmVnYXRlZCBiZW5lZmljaWFyeSBkYXRhLiBEZXZlbG9wIGEgd29ya3BsYW4gdG8gZW5zdXJlIHRoYXQgdGhleSBjYW4gbWVldCByZXBvcnRpbmcgcmVxdWlyZW1lbnRzLiANCg0KNy4gU29saWNpdCBtb25pdG9yaW5nIHJlcG9ydHMgZnJvbSBwYXJ0bmVycyBhbmQgZXhwbG9yZSB0aGUgcG9zc2liaWxpdHkgb2Ygam9pbnQgbW9uaXRvcmluZy4gDQoNCjguIFJldmlzZSB0aGUgNVcgdGVtcGxhdGUgLS0gaW4gY29uc3VsdGF0aW9uIHdpdGggcGFydG5lcnMgLS0gaW4gb3JkZXIgdG8gYWRkcmVzcyB0aGUgZGF0YSBjb2xsZWN0aW9uIGlzc3VlcyBpZGVudGlmaWVkLiANCg0KPGJyPjxicj4NCg0KIyMgNi4gUmVmZXJlbmNlIHRhYmxlIC0tIHRvd25zaGlwLWxldmVsDQoNCmBgYHtyIGRhdGF0YWJsZS10b3duc2hpcHMtcmVmZXJlbmNlfQ0KIyBhZGQgaW4gdGFyZ2V0DQpwaW4gJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCBhZG1pbjNfcGNvZGUsIHRvdGFsX3BvcCwgUElOXzIwMjIgPSBwaW5fMjAyMiwgSURQcyA9IGlkcHMpICU+JSANCiAgbXV0YXRlKHRvdGFsX3BvcCA9IHJvdW5kKHRvdGFsX3BvcCwgZGlnaXRzID0gMCkpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFjdGl2aXR5LCBwYXJ0bmVycyA9IGltcGxlbWVudGluZ19wYXJ0bmVycywgYmVuZWZpY2lhcmllcyA9IHVfYmVuLCBiZW5lZmljaWFyeV9mcmVxdWVuY2llcyA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KHBhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyeV9mcmVxdWVuY2llcyA9IHN1bShiZW5lZmljaWFyeV9mcmVxdWVuY2llcyksDQogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICByZXBsYWNlX25hKGxpc3QocGFydG5lcnMgPSAwLCBiZW5lZmljaWFyaWVzID0gMCwgYmVuZWZpY2lhcnlfZnJlcXVlbmNpZXMgPSAwLCBsb2NhdGlvbnMgPSAwKSkgJT4lIA0KICByZWxvY2F0ZShhZG1pbjNfcGNvZGUsIC5hZnRlciA9IElEUHMpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSAidG9wIiwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAgICAgImZ1bmN0aW9uKHNldHRpbmdzLCBqc29uKSB7IiwNCiAgICAgICAgICBwYXN0ZTAoIiQodGhpcy5hcGkoKS50YWJsZSgpLmNvbnRhaW5lcigpKS5jc3Moeydmb250LXNpemUnOiAnIiwgIjguNXB0IiwgIid9KTsiKSwNCiAgICAgICAgICAifSIpDQogICAgICAgKSANCiAgICAgKSANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyA3LiBSZWZlcmVuY2UgbWFwIC0tIHRvd25zaGlwLWxldmVsDQoNCmBgYHtyIHJlZmVyZW5jZS1tYXAtZ2dwbG90bHksIGZpZy5oZWlnaHQ9MTB9DQoNCiMgSSB0aGluayB5b3UgbmVlZCB0byBjb2FsZXNjZSB0aGUgc3RhdGVzIGFuZCB0b3duc2hpcHMgd2l0aCBwY29kZTNfc2hhcGUgb3Igc3RhcnQgd2l0aCBwY29kZTNfc2hhcGUNCnRzcF9tYXAgPC0gcGNvZGUzX3NoYXBlICU+JSANCiAgbGVmdF9qb2luKGJlbiAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoYWN0aXZpdHkpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4ocGluICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM19wY29kZSwgdG90YWxfcG9wLCBpZHBzLCBwaW5fMjAyMiksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gMC4xLA0KICAgICAgICAgIGFlcyhmaWxsID0gcGluXzIwMjIsDQogICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAodG93bnNoaXAsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUElOIDIwMjI6ICIsIHBpbl8yMDIyLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcgY291bnQ6ICIsIHBhcnRuZXJzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3QgY291bnQ6ICIsIGFjdGl2aXRpZXMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGJlbmVmaWNpYXJpZXMpKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAidHVyYm8iLCB0cmFucyA9ICJsb2cxMCIpICsgDQogIGxhYnMoZmlsbCA9ICJQSU4gMjAyMiIsDQogICAgICAgdGl0bGUgPSAiTWFwIG9mIHRvd25zaGlwcyBieSAyMDIyIFBJTiIpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCg0KZ2dwbG90bHkodHNwX21hcCwgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIHBsb3RseTo6c3R5bGUoaG92ZXJvbiA9ICJmaWxsIikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIk1hcCBvZiB0b3duc2hpcHMgYnkgMjAyMiBQSU4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSBvdmVyIGZvciBkZXRhaWxzOyBjbGljayBhbmQgZHJhZyB0byBzZWxlY3QgYW5kIHpvb20iLCI8L3N1cD4iKSkpDQpgYGANCg0K